C++ boost::random在不同状态下从同一种子生成相同的值的频率太高 问题描述

C++ boost::random在不同状态下从同一种子生成相同的值的频率太高 问题描述,c++,random,boost,mersenne-twister,uniform-distribution,C++,Random,Boost,Mersenne Twister,Uniform Distribution,有时我使用Mersenne Twister引擎从均匀分布中得到相同的随机数,即使我正确地使用了引擎并进行了迭代。我知道引擎可能状态的数量是有限的,可能生成的值的数量也是有限的,但现在不是这样 使用boost的实现,在[0;1e7]范围内生成了1e6个均匀分布的随机值。这意味着可能的值远多于所需的随机值。然而,我经常得到相同的值,有时在这个范围内超过100倍。这怎么可能呢 代码 提供了一个简单的代码来重现这种情况。在这两种平台上,我都遇到了相同的问题: MSVS 2019和boost rando

有时我使用Mersenne Twister引擎从均匀分布中得到相同的随机数,即使我正确地使用了引擎并进行了迭代。我知道引擎可能状态的数量是有限的,可能生成的值的数量也是有限的,但现在不是这样

使用boost的实现,在[0;1e7]范围内生成了1e6个均匀分布的随机值。这意味着可能的值远多于所需的随机值。然而,我经常得到相同的值,有时在这个范围内超过100倍。这怎么可能呢

代码 提供了一个简单的代码来重现这种情况。在这两种平台上,我都遇到了相同的问题:

  • MSVS 2019和boost random:x64 windows 1.71.0,以及
  • g++(Ubuntu 5.4.0-6ubuntu1~16.04.12)5.4.0 20160609,带有libboost dev 1.58.0.1ubuntu1
#包括
#包括
#include//随机数生成器
#包含//均匀分布生成器
使用名称空间std;
int main()
{
size\u t seed=static\u cast(std::chrono::system\u clock::now();

cout这不是Boost中的错误。问题是由于较旧的32位MersenneTwister提供的分辨率有限。您在累积分布上看到的步骤等于$1/2^{32}\大约10^{-10}$。几年前,我意识到一次模拟失败的代价高昂。解决方案是使用能够产生全精度倍增的RNG,同时通过所有统计测试套件,如MersenneTwister64或MIXMAX。

您是否从boost.org和试过了吗?如果您确实需要提交错误报告,1.58版本对于补丁来说太旧了。@user14717我已经在Windows上安装了boost 1.71,并且它具有相同的行为。
1755586.0406719148159
3354420.976247638464   <--
3630764.0071026980877
3488445.2889673411846  <--
7920481.4555123448372
8773544.1024415194988  <--
3354420.9766563926823  <--
3488445.2898126943037  <--
8773544.1042856499553  <--
...