c ++中的统一随机数生成器

Bah*_*can 3 c++ random tr1

我试图用C++ TR1在c ++中生成真正的随机数.但是,当再次运行我的程序时,它会产生相同的随机数.代码如下.

我需要每次运行的真随机数尽可能随机.

std::tr1::mt19937 eng;  
std::tr1::uniform_real<double> unif(0, 1);
unif(eng);
Run Code Online (Sandbox Code Playgroud)

Zet*_*eta 10

您必须使用种子初始化引擎,否则将使用默认种子:

eng.seed(static_cast<unsigned int >(time(NULL)));
Run Code Online (Sandbox Code Playgroud)

然而,真正的随机性是在没有额外输入的情况下在确定性机器上无法实现的.每个伪随机数生成器在某种程度上都是周期性的,这是你不会从非确定性数字中得到的.例如,std::mt19937具有2 19937 -1次迭代的周期.真正的随机性很难实现,因为您必须监控看似不确定的东西(用户输入,大气噪声).请参阅Jerry'sHandprint的答案.

如果您不想要基于时间的种子,您可以使用emsr的答案std::random_device所见.您甚至可以使用std::random_device生成器,这是最接近您使用标准库方法的真正随机性.


Jer*_*fin 7

这些是伪随机数生成器.他们永远不会产生真正随机的数字.为此,您通常需要特殊的硬件(例如,通常测量热二极管中的噪声或放射源的辐射).

为了从不同运行中的伪随机生成器获得差异序列,通常基于当前时间为生成器播种.

这产生了相当可预测的结果(即,其他人可以很容易地找出你使用的种子.如果你需要防止这种情况,大多数系统确实提供了至少相当随机数的一些来源.在Linux上,/ dev/random,和在Windows上CryptGenRandom.

然而,后者往往相当慢,所以你通常希望将它们用作种子,而不仅仅是从它们中检索所有随机数.