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】