你有没有喜欢的boost随机数生成器呢?能否简要解释一下如何将其实现到代码中。我正在尝试让mersenne twister工作,想知道有没有人对其他的偏好。
#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,以便您可以轻松更改随机数生成器类型。
rng
是 Twister 生成器的一个实例。
one_to_six
是 分布 的一个实例。它指定了我们要生成的数字及其遵循的分布。在这里,我们想要生成1到6之间的数字,并且它们是均匀分布的。
dice
是将原始数字和分布作为输入,并为我们创建实际所需数字的对象。
dice()
是对 dice
对象的 operator()
的调用,它获取以下分布的下一个随机数,模拟随机掷骰子得到的结果。
目前,此代码每次都会产生相同的骰子掷出序列。您可以在其构造函数中随机化生成器:
RNGType rng( time(0) );
或者使用它的seed()成员函数。
+-----------------------+-------------------+-----------------------------+------------------------+ | generator | 循环长度 | 大小约为 | 大约相对速度 | +-----------------------+-------------------+-----------------------------+------------------------+ | minstd_rand | 2^31-2 | sizeof(int32_t) | 40 | | rand48 | 2^48-1 | sizeof(uint64_t) | 80 | | lrand48 (C library) | 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 | +-----------------------+-------------------+-----------------------------+------------------------+循环长度:在重复之前随机数序列的长度。
没有一种适用于所有情况的随机数生成器。有时统计特性很重要,有时加密学很重要,有时原始速度很重要。