Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 具有上下文的确定性随机数生成器?_Objective C_C_Random_Seed - Fatal编程技术网

Objective c 具有上下文的确定性随机数生成器?

Objective c 具有上下文的确定性随机数生成器?,objective-c,c,random,seed,Objective C,C,Random,Seed,我正在寻找一个种子随机数生成器,它创建一个数字池作为上下文。不必太好。它用于游戏,但很重要的是,游戏引擎的每个实例都有自己的数字池,这样不同的游戏实例,甚至游戏中使用随机数字的其他部分都不会破坏生成数字的确定性 目前我使用的是rand(),它显然没有这个功能 是否有任何c或objective-c生成器能够实现我想要的功能?您可以使用random()和setstate()。我自己没有使用过setstate(),但手册页似乎表明它可能会执行您想要的操作…使用设置种子,然后使用rand(): 手册页明

我正在寻找一个种子随机数生成器,它创建一个数字池作为上下文。不必太好。它用于游戏,但很重要的是,游戏引擎的每个实例都有自己的数字池,这样不同的游戏实例,甚至游戏中使用随机数字的其他部分都不会破坏生成数字的确定性

目前我使用的是rand(),它显然没有这个功能


是否有任何c或objective-c生成器能够实现我想要的功能?

您可以使用
random()
setstate()
。我自己没有使用过
setstate()
,但手册页似乎表明它可能会执行您想要的操作…

使用设置种子,然后使用
rand()

手册页明确指出伪随机数序列可以重复(因此是确定性的):

srand()
函数将其参数设置为
rand()
返回的新伪随机整数序列的种子。通过使用相同的种子值调用
srand()
,可以重复这些序列


编辑(澄清):
请注意,手册页说明
srand()
是niether可重入的,也不是线程安全的。
我假设“不同的游戏实例”指的是不同的过程,在这种情况下可以使用它。
但是,如果您计划在同一个过程中更改种子,您将无法获得所需的功能。在这种情况下,我建议改用
rand\u r()
。看一看作为参考。

似乎你不需要“上下文”(不管它是什么意思);相反,您正在寻找一个可以保存和恢复当前状态的PRNG实现。实际上,这在您自己实现的任何PRNG实现中都是可能的(因为您始终可以保存状态),而库函数可能会或可能不会授予您访问状态的权限

对于Linux和MacOS,他们实际上在rand的基础上增加了一个rand_r——这是一个线程安全的可重入版本的rand,但其背后的“魔力”在于它使用指向当前状态的指针,而不是将其保存在静态变量中。其他随机数函数,如drand48系列,似乎也有带有附加参数的版本,尽管我必须进行更多阅读,以了解它是否可以用于存储状态


无论哪种方式,如果你用“谷歌”或“维基百科”来实现一个随机数生成器,那么将“当前状态”作为一个显式参数将是微不足道的。

要使用的“明显”PRNG是函数族。这些允许您提供48位状态,甚至允许您设置计算中使用的乘数和常数。

任何好的库都应该能够做到这一点。通过多种不同的算法和多种概率分布生成随机数。对
gsl\u rng\u alloc
的每次调用都会设置一个具有自己状态的独立随机数生成器,您可以使用
gsl\u rng\u set
进行种子设定。您可能希望对程序的不同部分使用不同的种子,并且根据您使用的PRNG算法,某些特定种子可能无法很好地工作。从中复制和粘贴一些数字可能是获取种子的一种好方法。

你需要这些随机数的具体用途是什么?请原谅我的无知,但确定性意味着什么?@Nick我假设OP希望在提供相同的种子值时能够重新生成相同的“随机”数字序列。你说“不必太好。它是用来玩游戏的。我花很多钱玩游戏,我期待这个世界!@Nick:确定性意味着如果给定相同的初始设置,它将产生相同的结果。换句话说,它意味着“不是随机的”“。在生成随机数的上下文中,这意味着生成的数字看起来是随机的,但可以根据初始种子进行计算。文档的相关部分是:
”srand()函数将其参数设置为rand()返回的新伪随机整数序列的种子。通过使用相同的种子值调用srand()可以重复这些序列。“
我认为您错过了问题中的“重要的是,游戏引擎的每个实例都有自己的数字池”部分。使用rand时,RNG的状态是全局的,如果您在程序中的任何位置使用rand(),这将影响程序的所有部分(同样,在程序中的任何位置调用srand将重置程序中所有位置的状态)。@sepp2k不同的游戏实例=不同的进程。这还不够吗?@EitanT我觉得他想在同一个过程中拥有多个游戏引擎实例。无论哪种方式,他也说了“或者甚至是游戏的其他部分”,因此他显然希望能够在游戏的某些部分使用随机数,而不会影响游戏引擎的RNG状态。@sepp2k不确定“其他部分”,但我现在在回答中补充说明。谢谢你的评论。
unsigned int seed = 10;  /* Choose an arbitrary value for the seed */
int r;

srand(seed);             /* Set the seed                           */
r = rand();              /* Generate a random number               */