随机数范围扩展方法总结
生活随笔
收集整理的這篇文章主要介紹了
随机数范围扩展方法总结
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目:
已知有個rand7()的函數(shù),返回1到7隨機自然數(shù),讓利用這個rand7()構(gòu)造rand10() 隨機1~10。
分析:要保證rand10()在整數(shù)1-10的均勻分布,可以構(gòu)造一個1-10*n的均勻分布的隨機整數(shù)區(qū)間(n為任何正整數(shù))。假設(shè)x是這個1-10*n區(qū)間上的一個隨機整數(shù),那么x%10+1就是均勻分布在1-10區(qū)間上的整數(shù)。由于(rand7()-1)*7+rand7()可以構(gòu)造出均勻分布在1-49的隨機數(shù)(原因見下面的說明),可以將41~49這樣的隨機數(shù)剔除掉,得到的數(shù)1-40仍然是均勻分布在1-40的,這是因為每個數(shù)都可以看成一個獨立事件。
下面說明為什么(rand7()-1)*7+rand7()可以構(gòu)造出均勻分布在1-49的隨機數(shù):
首先rand7()-1得到一個離散整數(shù)集合{0,1,2,3,4,5,6},其中每個整數(shù)的出現(xiàn)概率都是1/7。那么(rand7()-1)*7得到一個離散整數(shù)集合A={0,7,14,21,28,35,42},其中每個整數(shù)的出現(xiàn)概率也都是1/7。而rand7()得到的集合B={1,2,3,4,5,6,7}中每個整數(shù)出現(xiàn)的概率也是1/7。顯然集合A和B中任何兩個元素組合可以與1-49之間的一個整數(shù)一一對應(yīng),也就是說1-49之間的任何一個數(shù),可以唯一確定A和B中兩個元素的一種組合方式,反過來也成立。由于A和B中元素可以看成是獨立事件,根據(jù)獨立事件的概率公式P(AB)=P(A)P(B),得到每個組合的概率是1/7*1/7=1/49。因此(rand7()-1)*7+rand7()生成的整數(shù)均勻分布在1-49之間,每個數(shù)的概率都是1/49。
程序:
int rand_10() {int x = 0;do{x = 7 * (rand7() - 1) + rand7();}while(x > 40);return x % 10 + 1; } 注:由朋友問為什么用while(x>40)而不用while(x>10)呢?原因是如果用while(x>10)則有40/49的概率需要循環(huán)while,很有可能死循環(huán)了。
問題描述
已知random3()這個隨機數(shù)產(chǎn)生器生成[1, 3]范圍的隨機數(shù),請用random3()構(gòu)造random5()函數(shù),生成[1, 5]的隨機數(shù)?
問題分析
如何從[1-3]范圍的數(shù)構(gòu)造更大范圍的數(shù)呢?同時滿足這個更大范圍的數(shù)出現(xiàn)概率是相同的,可以想到的運算包括兩種:加法和乘法
考慮下面的表達式:
3 * (random3() – 1) + random3();
可以計算得到上述表達式的范圍是[1, 9]? 而且數(shù)的出現(xiàn)概率是相同的,即1/9
下面考慮如何從[1, 9]范圍的數(shù)生成[1, 5]的數(shù)呢?
可以想到的方法就是 rejection sampling 方法,即生成[1, 9]的隨機數(shù),如果數(shù)的范圍不在[1, 5]內(nèi),則重新取樣
解決方法
int random5() {int val = 0;do{val = 3 * (random3() - 1) + random3();}while(val > 5);return val; } 歸納總結(jié)
將這個問題進一步抽象,已知random_m()隨機數(shù)生成器的范圍是[1, m] 求random_n()生成[1, n]范圍的函數(shù),m < n && n <= m *m
一般解法: int random_n() {int val = 0;int t; //t為n的最大倍數(shù),且滿足t<m*mdo{val = m * (random_m() - 1) + random_m();}while(val > t);return val; }
已知有個rand7()的函數(shù),返回1到7隨機自然數(shù),讓利用這個rand7()構(gòu)造rand10() 隨機1~10。
分析:要保證rand10()在整數(shù)1-10的均勻分布,可以構(gòu)造一個1-10*n的均勻分布的隨機整數(shù)區(qū)間(n為任何正整數(shù))。假設(shè)x是這個1-10*n區(qū)間上的一個隨機整數(shù),那么x%10+1就是均勻分布在1-10區(qū)間上的整數(shù)。由于(rand7()-1)*7+rand7()可以構(gòu)造出均勻分布在1-49的隨機數(shù)(原因見下面的說明),可以將41~49這樣的隨機數(shù)剔除掉,得到的數(shù)1-40仍然是均勻分布在1-40的,這是因為每個數(shù)都可以看成一個獨立事件。
下面說明為什么(rand7()-1)*7+rand7()可以構(gòu)造出均勻分布在1-49的隨機數(shù):
首先rand7()-1得到一個離散整數(shù)集合{0,1,2,3,4,5,6},其中每個整數(shù)的出現(xiàn)概率都是1/7。那么(rand7()-1)*7得到一個離散整數(shù)集合A={0,7,14,21,28,35,42},其中每個整數(shù)的出現(xiàn)概率也都是1/7。而rand7()得到的集合B={1,2,3,4,5,6,7}中每個整數(shù)出現(xiàn)的概率也是1/7。顯然集合A和B中任何兩個元素組合可以與1-49之間的一個整數(shù)一一對應(yīng),也就是說1-49之間的任何一個數(shù),可以唯一確定A和B中兩個元素的一種組合方式,反過來也成立。由于A和B中元素可以看成是獨立事件,根據(jù)獨立事件的概率公式P(AB)=P(A)P(B),得到每個組合的概率是1/7*1/7=1/49。因此(rand7()-1)*7+rand7()生成的整數(shù)均勻分布在1-49之間,每個數(shù)的概率都是1/49。
程序:
int rand_10() {int x = 0;do{x = 7 * (rand7() - 1) + rand7();}while(x > 40);return x % 10 + 1; } 注:由朋友問為什么用while(x>40)而不用while(x>10)呢?原因是如果用while(x>10)則有40/49的概率需要循環(huán)while,很有可能死循環(huán)了。
問題描述
已知random3()這個隨機數(shù)產(chǎn)生器生成[1, 3]范圍的隨機數(shù),請用random3()構(gòu)造random5()函數(shù),生成[1, 5]的隨機數(shù)?
問題分析
如何從[1-3]范圍的數(shù)構(gòu)造更大范圍的數(shù)呢?同時滿足這個更大范圍的數(shù)出現(xiàn)概率是相同的,可以想到的運算包括兩種:加法和乘法
考慮下面的表達式:
3 * (random3() – 1) + random3();
可以計算得到上述表達式的范圍是[1, 9]? 而且數(shù)的出現(xiàn)概率是相同的,即1/9
下面考慮如何從[1, 9]范圍的數(shù)生成[1, 5]的數(shù)呢?
可以想到的方法就是 rejection sampling 方法,即生成[1, 9]的隨機數(shù),如果數(shù)的范圍不在[1, 5]內(nèi),則重新取樣
解決方法
int random5() {int val = 0;do{val = 3 * (random3() - 1) + random3();}while(val > 5);return val; } 歸納總結(jié)
將這個問題進一步抽象,已知random_m()隨機數(shù)生成器的范圍是[1, m] 求random_n()生成[1, n]范圍的函數(shù),m < n && n <= m *m
一般解法: int random_n() {int val = 0;int t; //t為n的最大倍數(shù),且滿足t<m*mdo{val = m * (random_m() - 1) + random_m();}while(val > t);return val; }
總結(jié)
以上是生活随笔為你收集整理的随机数范围扩展方法总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分治算法求最近点对
- 下一篇: Google面试题——及答案