使用mersenne twister c ++生成数字(0,1)

use*_*622 9 c++ mersenne-twister

我正在努力将R代码实现到C++中,以便它运行得更快,但是我在实现mersenne twister方面遇到了困难.我只想生成(0,1)之间的值.以下是我对此问题的看法.

#include <random>

std::mt19937 generator (123);

std::cout << "Random value: " << generator() << std:: endl;
Run Code Online (Sandbox Code Playgroud)

我试过除以RAND_MAX,但这并没有产生我想要的价值.

提前致谢.

sba*_*bbi 16

在C++ 11中,"(伪)随机生成器"和"概率分布"的概念是分开的,并且有充分的理由.

您可以通过以下方式实现您的目标:

  std::mt19937 generator (123);
  std::uniform_real_distribution<double> dis(0.0, 1.0);

  double randomRealBetweenZeroAndOne = dis(generator);
Run Code Online (Sandbox Code Playgroud)

如果你想了解为什么这种分离是必要的,以及为什么在生成器的输出上使用标准的分区/范围操作是一个坏主意,请观看此视频.

  • 这通常很糟糕,因为我们通常使用模数和/或引入偏差. (2认同)

Mr.*_*C64 7

你可能想要考虑这样的代码:

// For pseudo-random number generators and distributions
#include <random> 

...

// Use random_device to generate a seed for Mersenne twister engine.
std::random_device rd{};    

// Use Mersenne twister engine to generate pseudo-random numbers.
std::mt19937 engine{rd()};

// "Filter" MT engine's output to generate pseudo-random double values,
// **uniformly distributed** on the closed interval [0, 1].
// (Note that the range is [inclusive, inclusive].)
std::uniform_real_distribution<double> dist{0.0, 1.0};

// Generate pseudo-random number.
double x = dist(engine);
Run Code Online (Sandbox Code Playgroud)

有关用C产生伪随机数,更多的细节++(包括原因rand()没有好),看到这部影片由斯蒂芬T. Lavavej(从融入本土2013):

rand() 认为有害