增加随机数发生器
有没有人有一个最喜欢的助推随机数发生器,你可以解释一下如何实现它成代码。 我试图让梅森扭转工作,并想知道如果有人偏好对其他人之一。
这段代码是根据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。 有时统计性质是重要的,有时密码学,有时是原始的速度。