【问题标题】:Boost random number generatorBoost随机数生成器
【发布时间】:2011-01-16 07:54:04
【问题描述】:

有没有人有最喜欢的 boost 随机数生成器,你能解释一下如何在代码中实现它。我正在尝试让 mersenne twister 工作,并且想知道是否有人偏爱其他人。

【问题讨论】:

    标签: c++ boost random


    【解决方案1】:

    此代码改编自 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,因此您可以轻松更改随机数生成器类型。

    • rng 是twister 生成器的一个实例。

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

    • dice 接受原始数字和分布,并为我们创建我们真正想要的数字。

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

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

     RNGType rng( time(0) );   
    

    或者通过使用它的 seed() 成员。

    【讨论】:

    • 有没有什么方法可以改变整数分布的最小值和最大值,而不必构造一个新的“骰子”?
    • 有人知道如何用这个生成器设置随机播种吗?
    【解决方案2】:

    没有万能的 RNG。有时统计属性很重要,有时密码学很重要,有时原始速度很重要。

    【讨论】:

    • 我不一定想要一个适合所有人的尺寸,我只知道有些人更喜欢其中一种,我想看看人们最喜欢哪一种。
    【解决方案3】:

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

    +------------------------+--------------------+----- ------------------------------------+------------+ |发电机|周期长度 |大约内存要求 |大约相对速度 | +------------------------+--------------------+----- ------------------------------------+------------+ | minstd_rand | 2^31-2 |大小(int32_t)| 40 | |兰德48 | 2^48-1 |大小(uint64_t)| 80 | | lrand48 (C 库) | 2^48-1 | - | 20 | | ecuyer1988 |大约2^61 | 2*sizeof(int32_t) | 20 | |克鲁策1986 | ? |第1368章60 | |赫勒卡莱克1995 | 2^31-1 |大小(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(双) | 150 | | lagged_fibonacci1279 |大约2^67000 |第1279章150 | | lagged_fibonacci2281 |大约2^120000 | 2281*sizeof(双) | 150 | | lagged_fibonacci3217 |大约2^170000 | 3217*sizeof(双) | 150 | | lagged_fibonacci4423 |大约2^230000 | 4423*sizeof(双) | 150 | | lagged_fibonacci9689 |大约2^510000 | 9689*sizeof(双) | 150 | | lagged_fibonacci19937 |大约2^1050000 | 19937*sizeof(双) | 150 | | lagged_fibonacci23209 |大约2^1200000 | 23209*sizeof(双) | 140 | | lagged_fibonacci44497 |大约2^2300000 | 44497*sizeof(双) | 60 | +------------------------+--------------------+----- ------------------------------------+------------+

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 2023-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      • 1970-01-01
      相关资源
      最近更新 更多