84 2 構造乙個隨機發生器

2021-06-26 13:01:31 字數 1335 閱讀 4091

2.已知一隨機發生器,產生0的概率是p,產生1的概率是1-p,

現在要你構造乙個發生器,

使得它構造0和1的概率均為 1/2;

構造乙個發生器,使得它構造1、2、3 的概率均為 1/3; ...,

構造乙個發生器,使得它構造 1、2、3、...n 的概率均為1/n,要求複雜度最低。

/*

2.已知一隨機發生器,產生0的概率是p,產生1的概率是1-p,

現在要你構造乙個發生器,

使得它構造0和1的概率均為 1/2;

構造乙個發生器,使得它構造1、2、3 的概率均為 1/3; ...,

構造乙個發生器,使得它構造 1、2、3、...n 的概率均為1/n,要求複雜度最低。

思路:由於需要產生1/2,而用1位0,或1位1無法產生等概率,

因此,考慮將隨機數擴充套件成2位:

00 p*p

01 p*(1-p)

10 (1-p)*p

11 (1-p)*(1-p)

有上述分析知道,01和10是等概率的,因此我們只需要產生01和10就行了。

於是可以,遇到00和11就丟棄,只記錄01和10。可以令,01表示0,10表示1,則等概率1/2產生0和1了。

對於n=2,一次性生成兩個數字,認為01表示0,10表示1,

其它情況放棄,它們的概率都是p*(1-p);

對於n=3,一次性生成三個數字,認為001表示0,010表示1,100表示2,

其它情況放棄,它們的概率都是p*p*(1-p);

對於n=4,一次性生成是個數字,認為0001表示0,0010表示1,0100表示2,1000表示3,

其它情況放棄,它們的概率都是p*p*p*(1-p);

5為例,此時我們取x=2,因為c(2x,x)=c(4,2)=6是比5大的最小的x,

此時我們就是一次性生成4位二進位制,把1出現個數不是2的都丟棄,

這時候剩下六個:0011,0101,0110,1001,1010,1100,

取最小的5個,即丟棄1100,那麼我們對於前5個分別編號1到5,

這時候他們的概率都是p*p*(1-p)*(1-p)相等了。

關鍵是找那個最小的x,使得c(2x,x)>=n這樣能提公升查詢效率。

因為c(n,i)最大是在i接近n/2的地方取得,此時我有更大比率的序列用於生成,

換句話說被拋掉的更少了,這樣做是為了避免大量生成了丟棄序列而使得生成速率減慢,

實際上我之所以將x取定是為了讓我取得的序列生成的概率互相相等,

比如c(2x,x)的概率就是[p(1-p)]^x,

互等的樣例空間內保證了對應的每個值取得的樣例等概率。

*/

boost 隨機數發生器

在很多應用中都需要使用隨機數。本庫力求提供乙個高效的,通用的隨機數庫。boost庫有多種隨機數生成方式。先熟悉一下各種隨機數生成器的概念。數字生成器 number generator 它是乙個函式物件,沒有引數。類似於常見的rand 均勻隨機數生成器 uniform random number ge...

乙個全域性的定時事件發生器

新增 刪除定時事件 新增 刪除接收事件的物件 開始 停止事件發生器 設定事件發生器的靈敏度 利用nstimer作為事件的發生器 利用nsnotificationcenter作為事件的註冊和通知 timer addevent evt name1 interval nsnumber numberwith...

opencv隨機數發生器RNG

用opencv做演算法的朋友們肯定為隨機數煩惱過,新版本一直支援隨機數產生器啦,而且還繼續支援之前版本的c格式的函式,不過與時俱進,我這裡介紹c 的rng類。它可以壓縮乙個64位的i整數並可以得到scalar和array的隨機數。目前的版本支援均勻分布隨機數和gaussian分布隨機數。隨機數的產生...