boost random library的使用
生成滿足一定分布的隨機數,是統計模擬、系統仿真等應用中最基本的要求。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://blog.51cto.com/no001/1347208
總結
以上是生活随笔為你收集整理的boost random library的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt动态多语言的实现(VS2012开发)
- 下一篇: javascript中处理时间戳为日期格