Boost随机数生成器

28

你有没有喜欢的boost随机数生成器呢?能否简要解释一下如何将其实现到代码中。我正在尝试让mersenne twister工作,想知道有没有人对其他的偏好。

3个回答

68
此代码改编自Boost手册http://www.boost.org/doc/libs/1_42_0/libs/random/index.html
#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()成员函数。


1
是否有任何方法可以更改整数分布的最小值和最大值,而不必构建一个新的“骰子”? - Jorge Leitao
有人知道如何使用这个生成器设置随机种子吗? - slam_duncan

6
我找到了这个链接,它提供了不同随机数生成器的属性概述。下面是方便起见从上面链接中复制的表格:
+-----------------------+-------------------+-----------------------------+------------------------+
|       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 |
+-----------------------+-------------------+-----------------------------+------------------------+
循环长度:在重复之前随机数序列的长度。

1

没有一种适用于所有情况的随机数生成器。有时统计特性很重要,有时加密学很重要,有时原始速度很重要。


我并不一定想要一个适用于所有人的解决方案,我只是知道有些人更喜欢其中的一种,我想知道哪种最受人们喜爱。 - shinjuo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接