在很多應用中都需要使用隨機數。本庫力求提供乙個高效的,通用的隨機數庫。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)
隨機分布取均勻分布的隨機值作為輸入,輸出符合某一分布的隨機數。
variate_generator類模板
變種生成器用來組合隨機數生成器和隨機分布。關於生成器和分布,boost庫提供了很多現成的。
概要:template
class variate_generator;
比較迷惑人的是兩個operator( )。
看到庫後,發現有太多的生成器。每種生成器有不同的性質,記憶體要求,速度等。做為乙個非專業人士,我不知道如何選擇。庫的說明文件中指出,如果不清楚如何選擇,就使用mt19937,好吧,我就用mt19937了。
這裡所有的生成器都是,typedef 進行專門化來給出的,封裝在 boost::random 名字空間中。例如:
typedef random::mersenne_twister< > mt19937;
用法:boost::variate_generator> 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」首次出現時的試驗次數
********_distribution ?
?exponential_distribution
指數分布
放射性物質發射 alpha 粒子的間隔時間
normal_distribution
無窮次重複伯努利試驗的結果計數
投擲硬幣 10000 次,記錄正面出現的次數
lognormal_distribution
對數正態分佈 (lognormal distribution) (有時用於模擬)
流水線工人的工作完成時間
uniform_on_sphere
任意給定維數空間的單位球面上的均勻分布
在地球 (近似看作是球體) 表面任選一點去旅遊
void test_mt19937()
} void test_rand48()
} // uniform_smallint:在小整數域內的均勻分布
// uniform_int:在整數域上的均勻分布
// uniform_01:在區間[0,1]上的實數連續均勻分布
// uniform_real:在區間[min,max]上的實數連續均勻分布
// bernoulli_distribution:伯努利分布
// binomial_distribution:二項分布
// cauchy_distribution:柯西(洛倫茲)分布
// gamma_distribution:伽馬分布
// poisson_distribution:泊松分布
// geometric_distribution:幾何分布
// ********_distribution:三角分布
// exponential_distribution:指數分布
// normal_distribution:正態分佈
// lognormal_distribution:對數正態分佈
// uniform_on_sphere:球面均勻分布
void test_random_distribute()
// 2. uniform_01
boost::uniform_01u01(rng);
for (int i = 0; i < 10; ++i)
}
opencv隨機數發生器RNG
用opencv做演算法的朋友們肯定為隨機數煩惱過,新版本一直支援隨機數產生器啦,而且還繼續支援之前版本的c格式的函式,不過與時俱進,我這裡介紹c 的rng類。它可以壓縮乙個64位的i整數並可以得到scalar和array的隨機數。目前的版本支援均勻分布隨機數和gaussian分布隨機數。隨機數的產生...
產生隨意隨機數發生器
怎樣利用給定的隨機數發生器產生其它隨意你想得到的隨機數發生器。假定給定的隨機數發生器是變數產生離散變數x 服從某一分布 比如均勻分布。高斯分布等等 隨意你想得到的隨機數發生器滿足分布 y,如果x和 y其概率密度分布函式分布為 g x h y 假定用x 隨機數發生器產生 y隨機數發生器,以下分為2步求...
OpenCV iOS 隨機數發生器(7)
隨機發生器 rng全稱random number generator 通過隨機發生器 rng 生成得到均勻分布的隨機數。與解析 畫圓為例 1 首先生成乙個random number generator物件 rng 用數值 0xffffffff 來例項化的乙個rng物件 rng rng 0xfffff...