我正在寻找一个种子随机数生成器,它创建一个数字池作为上下文。它不必太好。它用于游戏,但重要的是,游戏引擎的每个实例都有自己的数字池,因此不同的游戏实例甚至游戏的其他部分使用随机数不会破坏生成的数字。
目前我正在使用 rand() ,它显然没有这个功能。
是否有任何 c 或 Objective-c 生成器能够执行我想要的操作?
我正在寻找一个种子随机数生成器,它创建一个数字池作为上下文。它不必太好。它用于游戏,但重要的是,游戏引擎的每个实例都有自己的数字池,因此不同的游戏实例甚至游戏的其他部分使用随机数不会破坏生成的数字。
目前我正在使用 rand() ,它显然没有这个功能。
是否有任何 c 或 Objective-c 生成器能够执行我想要的操作?
用于srand
设置种子,然后使用rand()
:
unsigned int seed = 10; /* Choose an arbitrary value for the seed */
int r;
srand(seed); /* Set the seed */
r = rand(); /* Generate a random number */
手册页明确指出伪随机数序列可以重复(因此它是确定性的):
该
srand()
函数将其参数设置为要返回的新伪随机整数序列的种子rand()
。通过使用相同的种子值调用这些序列是可重复的。srand()
编辑(澄清):
请注意,手册页声明srand()
既不是可重入的,也不是线程安全的。
我假设“不同的游戏实例”是指不同的进程,在这种情况下可以使用它。
但是,如果您计划在同一过程中更改种子,您将无法获得所需的功能。在这种情况下,我建议rand_r()
改用。看看这个问题以供参考。
看来您不需要“上下文”(无论这意味着什么);相反,您正在寻找可以保存和恢复当前状态的 PRNG 实现。对于您自己实现的任何 PRNG 实现,这实际上是可能的(因为您始终可以保存状态),而库函数可能会或可能不会让您访问状态。
对于 Linux 和 MacOS,他们实际上在 rand 之外添加了一个 rand_r——这被记录为 rand 的线程安全、可重入版本,但其背后的“魔力”只是它需要一个指向当前状态的指针而不是保持它在一个静态变量中。像 drand48 系列这样的其他随机数函数似乎也有带有附加参数的版本,尽管我需要做更多的阅读来了解它是否可以用来存储状态。
无论哪种方式,如果您使用“google”或“wikipedia”来实现自己的随机数生成器,那么将“当前状态”设为显式参数将是微不足道的。
您也许可以使用random()
和setstate()
。我自己没用过setstate()
,但手册页似乎表明它可能会做你想做的事……</p>
要使用的“明显”PRNG 是drand48()
函数族。这些允许您提供 48 位状态,甚至允许您设置计算中使用的乘数和常数。
任何好的PRNG库都应该能够做到这一点。 GNU 科学库支持通过许多不同的算法和从许多概率分布生成随机数。每次调用都会gsl_rng_alloc
设置一个具有自己状态的独立随机数生成器,您可以使用gsl_rng_set
. 您可能希望对程序的不同部分使用不同的种子,并且根据您使用的 PRNG 算法,某些特定的种子可能无法很好地工作。从random.org复制和粘贴一些数字可能是获取种子的好方法。