天天看點

boost庫之Random

Random     随機數

在很多應用中都需要使用随機數。本庫力求提供一個高效的,通用的随機數庫。boost庫有多種随機數生成方式。先熟悉一下各種随機數生成器的概念。

數字生成器(Number Generator)

它是一個函數對象,沒有參數。類似于常見的rand( )。

均勻随機數生成器(Uniform Random Number Generator)

在一個範圍内生成随機數,有強下界和強上界。一個例外是對于小數沒有強上界,即v.min() <= x < v.max(),這主要是為了考慮形如[0,1)這類随機數。

不确定均勻随機數生成器(Non-deterministric Uniform Random Number Generator)

原話是:“一個不确定均勻随機數生成器是一個 UniformRandomNumberGenerator,它基于某種随機過程,是以能提供“真正随機的”的随機數序列。随機過程包括原子核衰變、Zehner 二極管的噪音、量子隧道效應、投擲骰子、罐中取物、投擲硬币等等。網絡資料包到達的間隔、鍵盤事件有時也可以被看作随機過程。” 從這段話來看,這個模型是最先進的,不知道有沒有實作。

僞随機數生成器(Pseudo-random Number Generator)

這是一種Uniform Random Number Generator,使用了某些線性算法。通常需要提供seed。

随機分布(Random Distrubution)

随機分布取均勻分布的随機值作為輸入,輸出符合某一分布的随機數。

頭檔案 <boost/random.hpp>

variate_generator 類模闆

變種生成器用來組合随機數生成器和随機分布。關于生成器和分布,boost庫提供了很多現成的。

概要:

template<class Engine, class Distribution>

class variate_generator

{

public:

typedef Engine engine_type;

typedef Distribution distribution_type;

typedef typename Distribution::result_type result_type;

variate_generator(Engine e, Distribution d);

result_type operator()();

template<class T>

result_type operator()(T value);

engine_value_type& engine();

const engine_value_type& engine() const;

result_type min() const;

result_type max() const;

};

比較迷惑人的是兩個operator( )。

生成器

看到庫後,發現有太多的生成器。每種生成器有不同的性質,記憶體要求,速度等。做為一個非專業人士,我不知道如何選擇。庫的說明文檔中指出,如果不清楚如何選擇,就使用mt19937,好吧,我就用mt19937了。

這裡所有的生成器都是,typedef 進行專門化來給出的,封裝在 boost::random 名字空間中。例如:

typedef random::mersenne_twister< > mt19937;

用法:

        boost::variate_generator<boost::mt19937, boost::uniform_real<> > vgen (boost::mt19937(),boost::uniform_real<>(0, 1)); //生成 [0, 1)的随機數

for(int i = 0; i < 10; i++)              cout<< vgen( );

分布

講到分布,這個數學知識就更深了。我從手冊上copy一份表格吧.

分布 描述 執行個體
uniform_smallint 在小整數集 (遠小于内部生成器的值域) 上的離散均勻分布 罐中取物
uniform_int 在整數集上的離散均勻分布;可能會多次調用内部生成器以獲得足夠多的“随機性” 罐中取物
uniform_01 區間 [0,1) 上的連續均勻分布;此分布是其它分布的重要基礎 -
uniform_real 實數區間 [min, max) 上的連續均勻分布 随機投下一木棍,其偏轉角的弧度數是 [0, 2pi) 上的這種分布 (假設偏轉角的分布是均勻的)
bernoulli_distribution 伯努利試驗 (Bernoulli experiment):布爾離散分布,機率可配置 投擲硬币 (p=0.5)
geometric_distribution 幾何分布:重複伯努利試驗,直到出現某一結果的試驗次數 抛擲骰子,記錄“6”首次出現時的試驗次數
triangle_distribution ? ?
exponential_distribution 指數分布 放射性物質發射 alpha 粒子的間隔時間
normal_distribution 無窮次重複伯努利試驗的結果計數 投擲硬币 10000 次,記錄正面出現的次數
lognormal_distribution 對數正态分布 (lognormal distribution) (有時用于模拟) 流水線勞工的工作完成時間
uniform_on_sphere 任意給定維數空間的機關球面上的均勻分布 在地球 (近似看作是球體) 表面任選一點去旅遊

【轉自:http://blog.sina.com.cn/s/blog_67b9b8d00100qm73.html】