boost random library的使用

本文通过实例介绍了如何使用boostrandom库生成满足特定分布的随机数,包括伪随机数发生器的选择、分布函数的定义及结合生成随机数的过程。详细解释了如何从均匀分布变换到所需的分布,适用于统计模拟、系统仿真的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
生成满足一定分布的随机数,是统计模拟、系统仿真等应用中最基本的要求。matlab中提供了函数可以生成各种常见分布的随机数,c++使用boost random库也可以很容易实现。

一、例子

boost random库的文档提供了一个例子,模拟掷色子。投掷一个均匀的色子,六个面每个面出现的概率应该是相等的,也就是说,投掷出的点数应该是服从{ 1 2 3 4 5 6 } 上的均匀分布的。

#include <boost/random.hpp>
#include <boost/random.hpp>
#include <iostream>

int main()

{

   boost::mt19937gen;                                     
   boost::uniform_int<>dist(1,6);
   boost::variate_generator<boost::mt19937&,boost::uniform_int<>>die(gen,dist);


    for( int i=0; i<10; ++i) {
       std::cout<<die() <<std::endl;
   }
}

 

上面的例子虽然简单,但也可以看出要生成满足一定分布的伪随机数的一般步骤:

首先,我们需要一个伪随机数发生器(generator)。语句

boost::mt19937 gen;

声明了一个mt19937类型的伪随机数发生器gen。boost一共提供了17种类型伪随机发生器供使用者选择,它们是:

minstd_rand,  rand48, lrand48, ecuyer1988, kreutzer1986, hellekalek1995, mt11213b, mt19937, lagged_fibonacci 607, lagged_fibonacci1279, lagged_fibonacci2281, lagged_fibonacci3217, lagged_fibonacci4423, lagged_fibonacci9689, lagged_fibonacci19937, lagged_fibonacci23209, lagged_fibonacci44497。

总之,名字是一个比一个丑啊。到底选用何种发生器,需要使用者在性能、质量和内存之间进行权衡,一般的应用的话,boost文档推荐使用mt19937就够了。也可以选择多种发生器,使结果相互印证,从而更可信。

其次,需要一个分布函数。由伪随机数发生器生成的伪随机数一般是一个很大区间上的均匀分布(如[1,2^99999999])。而要产生我们想要的分布的随机数(本例中,我们想要的分布为 {1 2 3 4 5 6 }上的均匀分布),还要对它们做某些变换。

boost::uniform_int<> dist(1, 6);

就是干这个事的。

boost random提供了如下的分布函数:

uniform_smallint ------ 一个整数集上的离散均匀分布

uniform_int ------ 一个整数集上的离散均匀分布

uniform_01 ------ [0, 1)上的连续均匀分布

uniform_real ------ [ min, max)上的连续均匀分布

bernoulli_distribution ------ 伯努利分布

geometric_distribution ------ 几何分布

triangle_distribution ------ 三角分布

exponential_distribution ------ 指数分布

normal_distribution ------ 正态分布

lognormal_distribution ------ 对数正态分布

uniform_on_sphere ------ 球面上的均匀分布

 

 

最后,把以上两个结合生成我们想要的随机数发生器:

boost::variate_generator<boost::mt19937&, boost::uniform_int<> > die(gen, dist);

转载于:https://www.cnblogs.com/wjgaas/p/3848979.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值