我正在寻找一个种子随机数生成器,它可以创建一个数字池作为上下文。它不一定太好。它用于游戏,但重要的是,游戏引擎的每个实例都有自己的数字池,因此不同的游戏实例甚至游戏中使用随机数的其他部分都不会破坏游戏的确定性特征。生成的数字。
目前我正在使用rand(),它显然没有此功能。
是否有任何能够做我想做的c或Objective-c发电机?
答案 0 :(得分:7)
使用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()
代替。请查看this question以供参考。
答案 1 :(得分:3)
似乎你不需要“背景”(无论这意味着什么);相反,您正在寻找一个PRNG实现,您可以在其中保存和恢复当前状态。这实际上可以用于您自己实现的任何PRNG实现(因为您总是可以保存状态),而库函数可能会也可能不会允许您访问该状态。
对于Linux和MacOS,他们实际上除了rand之外还添加了一个rand_r - 这被记录为rand的线程安全,可重入版本,但其背后的“魔力”只是它需要一个指向当前状态的指针而不是将其保存在静态变量中。其他随机数函数如drand48系列似乎也有附加参数的版本,虽然我需要做更多的阅读以确定它是否可用于存储状态。
无论哪种方式,如果您使用随机数生成器'google'或'wikipedia'来实现自己,那么将'当前状态'作为一个显式参数将是微不足道的。
答案 2 :(得分:2)
您可以使用random()
和setstate()
。我自己没有使用setstate()
,但是联机帮助页似乎表明它可能会做你想要的......
答案 3 :(得分:2)
要使用的'明显'PRNG是drand48()
系列函数。这些允许您提供48位状态,甚至允许您设置计算中使用的乘数和常数。
答案 4 :(得分:2)
任何好的PRNG库都应该能够做到这一点。 GNU Scientific Library支持通过许多不同的算法和许多概率分布生成随机数。每次调用gsl_rng_alloc
都会设置一个独立的随机数生成器,该生成器具有自己的状态,您可以使用gsl_rng_set
来播种。您可能希望为程序的不同部分使用不同的种子,并且根据您使用的PRNG算法,某些特定种子可能无法正常工作。从random.org复制和粘贴一些数字可能是获取种子的好方法。