增加随机数发生器

有没有人有一个最喜欢的助推随机数发生器,你可以解释一下如何实现它成代码。 我试图让梅森扭转工作,并想知道如果有人偏好对其他人之一。

这段代码是根据http://www.boost.org/doc/libs/1_42_0/libs/random/index.html中的boost手册改编的:

#include <iostream> #include "boost/random.hpp" #include "boost/generator_iterator.hpp" using namespace std; int main() { typedef boost::mt19937 RNGType; RNGType rng; boost::uniform_int<> one_to_six( 1, 6 ); boost::variate_generator< RNGType, boost::uniform_int<> > dice(rng, one_to_six); for ( int i = 0; i < 6; i++ ) { int n = dice(); cout << n << endl; } } 

解释一下:

  • mt19937是mersenne twister生成器,它生成原始随机数。 这里使用了typedef,所以你可以很容易地改变随机数字发生器的types。

  • rng是扭曲发生器的一个实例。

  • one_to_six分配的一个实例。 这指定了我们想要生成的数字以及它们所遵循的分布。 这里我们要1到6,均匀分配。

  • dice是需要原始数字和分布的东西,并为我们创造我们实际需要的数字。

  • dice()是对dice对象的operator()的调用,它获得分布之后的下一个随机数,模拟一个随机的六面掷骰子。

就目前而言,这段代码每次产生相同的掷骰子序列。 您可以在其构造函数中随机化生成器:

  RNGType rng( time(0) ); 

或使用其seed()成员。

我发现这个链接 ,它给出了不同的随机数发生器的属性的一个很好的概述。 为了方便,我已经从上面的链接复制了表格:

 + ----------------------- + ------------------- + ----- ------------------------ + ------------------------ +
 | 发生器| 周期的长度| 约。 内存要求| 约。 相对速度|
 + ----------------------- + ------------------- + ----- ------------------------ + ------------------------ +
 |  minstd_rand |  2 ^ 31-2 |  sizeof(int32_t)|  40 |
 |  rand48 |  2 ^ 48-1 |  sizeof(uint64_t)|  80 |
 |  lrand48(C库)|  2 ^ 48-1 |  -  |  20 |
 |  ecuyer1988 | 约。  2 ^ 61 |  2 * sizeof(int32_t)|  20 |
 |  kreutzer1986 |  ?  |  1368 * sizeof(uint32_t)|  60 |
 |  hellekalek1995 |  2 ^ 31-1 |  sizeof(int32_t)|  3 |
 |  mt11213b |  2 ^ 11213-1 |  352 * sizeof(uint32_t)|  100 |
 |  mt19937 |  2 ^ 19937-1 |  625 * sizeof(uint32_t)|  100 |
 |  lagged_fibonacci607 | 约。  2 ^ 32000 |  607 * sizeof(double)|  150 |
 |  lagged_fibonacci1279 | 约。  2 ^ 67000 |  1279 * sizeof(double)|  150 |
 |  lagged_fibonacci2281 | 约。  2 ^ 120000 |  2281 * sizeof(double)|  150 |
 |  lagged_fibonacci3217 | 约。  2 ^ 170000 |  3217 * sizeof(double)|  150 |
 |  lagged_fibonacci4423 | 约。  2 ^ 230000 |  4423 * sizeof(double)|  150 |
 |  lagged_fibonacci9689 | 约。  2 ^ 510000 |  9689 * sizeof(double)|  150 |
 |  lagged_fibonacci19937 | 约。  2 ^ 1050000 |  19937 * sizeof(double)|  150 |
 |  lagged_fibonacci23209 | 约。  2 ^ 1200000 |  23209 * sizeof(double)|  140 |
 |  lagged_fibonacci44497 | 约。  2 ^ 2300000 |  44497 * sizeof(double)|  60 |
 + ----------------------- + ------------------- + ----- ------------------------ + ------------------------ +

周期长度:开始重复之前随机数字序列的长度

没有一个通用的RNG。 有时统计性质是重要的,有时密码学,有时是原始的速度。