提升随机数发生器

shi*_*juo 26 c++ random boost

有没有人有一个最喜欢的增强随机数生成器,你能解释一下如何在代码中实现它.我试图让mersenne twister工作,并想知道是否有人偏好其他人之一.

小智 65

此代码改编自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;
     }
}
Run Code Online (Sandbox Code Playgroud)

解释一下:

  • mt19937是mersenne twister生成器,它生成原始随机数.这里使用了typedef,因此您可以轻松更改随机数生成器类型.

  • rng 是捻线机发生器的一个实例.

  • one_to_six分发的实例 .这指定了我们要生成的数字以及它们遵循的分布.这里我们要1到6,均匀分布.

  • dice 是原始数字和分布的东西,并为我们创建我们真正想要的数字.

  • dice()是调用operator()dice对象,它得到了一个随机数的分布如下,模拟随机六面骰子掷.

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

 RNGType rng( time(0) );   
Run Code Online (Sandbox Code Playgroud)

或者使用其seed()成员.


Jat*_*mar 5

我发现这个链接很好地概述了不同随机数生成器的属性。为方便起见,我从上面的链接复制了表格:

+----------------------+--------------------+----- ------------------------+------------------------+
| 发电机| 周期长度| 大约 内存要求| 大约 相对速度|
+----------------------+--------------------+----- ------------------------+------------------------+
| minstd_rand | 2^31-2 | sizeof(int32_t) | 40 |
| rand48 | 2^48-1 | 大小(uint64_t)| 80 |
| lrand48 (C 库) | 2^48-1 | - | 20 |
| ecuyer1988 | 大约 2^61 | 2*sizeof(int32_t) | 20 |
| kreutzer1986 | ? | 第 1368 章 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 |
| 滞后_fibonacci607 | 大约 2^32000 | 607*sizeof(double) | 150 |
| 滞后_fibonacci1279 | 大约 2^67000 | 第 1279 章 150 |
| 滞后_fibonacci2281 | 大约 2^120000 | 2281*sizeof(double) | 150 |
| 滞后_fibonacci3217 | 大约 2^170000 | 3217*sizeof(double) | 150 |
| 滞后_fibonacci4423 | 大约 2^230000 | 4423*sizeof(double) | 150 |
| 滞后_fibonacci9689 | 大约 2^510000 | 9689*sizeof(double) | 150 |
| Lagged_fibonacci19937 | 大约 2^1050000 | 19937*sizeof(double) | 150 |
| 滞后_fibonacci23209 | 大约 2^1200000 | 23209*sizeof(double) | 140 |
| 滞后_fibonacci44497 | 大约 2^2300000 | 44497*sizeof(double) | 60 |
+----------------------+--------------------+----- ------------------------+------------------------+

循环长度:开始重复之前的随机数序列的长度