Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.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
C++ 如何编写可重复的伪随机数生成器?_C++_Objective C_C_Random - Fatal编程技术网

C++ 如何编写可重复的伪随机数生成器?

C++ 如何编写可重复的伪随机数生成器?,c++,objective-c,c,random,C++,Objective C,C,Random,例如: rprng(4,2) = 17 rprng(4,5) = 21 rprng(4,2) = 17 如果rprng(seed,index)是我的函数,那么对于任何一对(seed,index),对于给定的(seed,index),我应该总是得到相同的值 例如: rprng(4,2) = 17 rprng(4,5) = 21 rprng(4,2) = 17 使用srand(seed)之后,myval=rand()的所有用法都将是伪随机的。我经常使用这种方法,因为它是从任何给定种子获得相同

例如:

rprng(4,2) = 17
rprng(4,5) = 21
rprng(4,2) = 17 
如果
rprng(seed,index)
是我的函数,那么对于任何一对
(seed,index)
,对于给定的
(seed,index)
,我应该总是得到相同的值

例如:

rprng(4,2) = 17
rprng(4,5) = 21
rprng(4,2) = 17 

使用srand(seed)之后,myval=rand()的所有用法都将是伪随机的。我经常使用这种方法,因为它是从任何给定种子获得相同值的最简单方法。

一个简单的想法是使用一个PRNG,它非常彻底,以至于由
种子
种子+1
种子+2
生成的值。。。是可以接受的随机性。例如:

#include <random>

unsigned prng(unsigned seed, unsigned index)
{
  thread_local std::mt19937 engine;  // or a different engine
  engine.seed(seed + index);

  return engine();
}
#包括
无符号prng(无符号种子、无符号索引)
{
线程\本地std::mt19937引擎;//或其他引擎
种子(种子+指数);
返回引擎();
}

还要检查此线程:

但它必须是伪随机的!伪随机!=随机的伪随机仍然只是数学。好吧,划掉它。你只是看起来好像没有做任何研究。看看现有的好的PRNG,比如带进位的乘法,线性同余生成器,或者如果你能忍受的话,Mersenne绕圈器。你怎么回事啊?你不需要自己创造一个好的,原创的PRNG,事实上你可能不应该尝试。此外,您的符号是不寻常的。prng通常被视为流而不是随机访问,即
prng(状态)
返回下一个数字并改变状态,类似
prng(种子,i)
(通常称为
skip
)的函数不存在或是次要的。请使用哈希函数。我会使用SipHash(可能更少的轮数),种子作为键,索引作为消息。@delnan,PRNG通常被当作流来讨论,而John要求的功能是不存在的或次要的。这就是为什么约翰可能做了研究,却没有找到他需要的东西。在一些重要的领域(如程序纹理),对PR编号的“随机访问”(令人困惑地使用一个术语)很重要:或者换句话说,PRNG需要是无状态的,这样我们可以在许多不同的线程、许多显示帧上重新计算随机(a1、a2、an),并始终获得一致的结果。虽然这是正确的,时间复杂度为O(指数),即线性。当有好的恒定时间算法可供选择时,为什么要使用低效的算法?实际上,从顺序种子PRNG中获取第0个随机数通常是不可接受的随机数。请参见“难道我不能使用具有不同种子值的随机数生成器吗?”下面的内容,其中正是解决这一“常见误解”的地方,并展示了糟糕的结果。当大多数PRNG不是以这种方式使用时,您如何找到“如此彻底”的PRNG?然而,您在mathoverflow.net上链接到的问题确实有很好的答案:使用(好的)哈希或LFSR。@LarsH非常有趣的评论。Mersenne Twister的单值构造函数执行简单(某种)预热(例如和注释)的事实可能会缓解此类问题(?)可能。这是值得测试的。一个测试是将以这种方式生成的前65536个值绘制为256x256网格上的灰度值。另一种方法是在以这种方式生成的前65536个坐标对处绘制一个白点。(另发自)