boost random library的使用

 
生成知足必定分佈的隨機數,是統計模擬、系統仿真等應用中最基本的要求。matlab中提供了函數能夠生成各類常見分佈的隨機數,c++使用boost random庫也能夠很容易實現。

1、例子ios

boost random庫的文檔提供了一個例子,模擬擲色子。投擲一個均勻的色子,六個面每一個面出現的機率應該是相等的,也就是說,投擲出的點數應該是服從{ 1 2 3 4 5 6 } 上的均勻分佈的。c++

#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;
   }
}

 

上面的例子雖然簡單,但也能夠看出要生成知足必定分佈的僞隨機數的通常步驟:dom

首先,咱們須要一個僞隨機數發生器(generator)。語句函數

boost::mt19937 gen;性能

聲明瞭一個mt19937類型的僞隨機數發生器gen。boost一共提供了17種類型僞隨機發生器供使用者選擇,它們是:spa

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。orm

總之,名字是一個比一個醜啊。到底選用何種發生器,須要使用者在性能、質量和內存之間進行權衡,通常的應用的話,boost文檔推薦使用mt19937就夠了。也能夠選擇多種發生器,使結果相互印證,從而更可信。內存

其次,須要一個分佈函數。由僞隨機數發生器生成的僞隨機數通常是一個很大區間上的均勻分佈(如[1,2^99999999])。而要產生咱們想要的分佈的隨機數(本例中,咱們想要的分佈爲 {1 2 3 4 5 6 }上的均勻分佈),還要對它們作某些變換。ci

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);

相關文章
相關標籤/搜索