等概率隨機函式的實現

2021-10-04 12:35:40 字數 837 閱讀 4822

解決思路:可以通過已知隨機函式rand()產生等概率產生0和1的新隨機函式rand(),然後呼叫k(k為整數n的二進位制表示的位數)次rand()函式,得到乙個長度為k的0和1序列,以此序列所形成的整數即為1--n之間的數字。注意:從產生序列得到的整數有可能大於n,如果大於n的話,則重新產生直至得到的整數不大於n。

第一步:由rand()函式產生rand()函式,rand()函式等概率產生0和1。

int rand()

第二步:計算整數n的二進位制表示所擁有的位數k,k = 1 +log2n(log以2為底n)

第三步:呼叫k次rand()產生隨機數。

int newrand()

思路:很多人的第一反應是利用rand5() + rand()%3來實現rand7()函式,這個方法確實可以產生1-7之間的隨機數,但是仔細想想可以發現數字生成的概率是不相等的。rand()%3 產生0的概率是1/5,而產生1和2的概率都是2/5,所以這個方法產生6和7的概率大於產生5的概率。

正確的方法是利用rand5()函式生成1-25之間的數字,然後將其中的1-21對映成1-7,丟棄22-25。例如生成(1,1),(1,2),(1,3),則看成rand7()中的1,如果出現剩下的4種,則丟棄重新生成。

兩次rand(5)其實是指的兩個5進製的數,將其轉化為10進製也就是5 * (rand5() - 1) + rand5()

簡單實現:

int rand7()

while(x > 21);

return 1 + x%7;

等概率隨機函式的實現

題目 已知隨機函式rand 以p的概率產生0,以1 p的概率產生1,現在要求設計乙個新的隨機函式newrand 使其以1 n的等概率產生1 n之間的任意乙個數。解決思路 可以通過已知隨機函式rand 產生等概率產生0和1的新隨機函式rand 然後呼叫k k為整數n的二進位制表示的位數 次rand 函...

等概率隨機函式的實現

題目 已知隨機函式rand 以p的概率產生0,以1 p的概率產生1,現在要求設計乙個新的隨機函式newrand 使其以1 n的等概率產生1 n之間的任意乙個數。解決思路 可以通過已知隨機函式rand 產生等概率產生0和1的新隨機函式rand 然後呼叫k k為整數n的二進位制表示的位數 次rand 函...

非等概率隨機演算法

自己做了乙個非等概率的隨機演算法的封裝,然後後面人的可以借用。probability是概率,最好是兩位小數,然後返回1的概率是probability,返回0的概率是1 probability 如果是三元組或者是多元組,多返回幾個值就可以了 int notequalprobability float ...