【轉】有rand7(可以隨機生成1到7的數據的隨機函數),如何產生rand10(隨機產生1-10的數)


今天停GJP說在面試的時候碰到了一道這樣的題目:有rand7(可以隨機生成1到7的數據的隨機函數),如何產生rand10(隨機產生1-10的數)

感覺很有意思,找到了這篇博客,感覺解法很好玩,轉載在這里

轉自:http://blog.163.com/yichangjun1989%40126/blog/static/131972028201441322112250/

已知有個rand7()的函數,返回1到7隨機自然數,讓利用這個rand7()構造rand10() 隨機1~10。

分析:要保證rand10()在整數1-10的均勻分布,可以構造一個1-10*n的均勻分布的隨機整數區間(n為任何正整數)。假設x是這個1-10*n區間上的一個隨機整數,那么x%10+1就是均勻分布在1-10區間上的整數。由於(rand7()-1)*7+rand7()可以構造出均勻分布在1-49的隨機數(原因見下面的說明),可以將41~49這樣的隨機數剔除掉,得到的數1-40仍然是均勻分布在1-40的,這是因為每個數都可以看成一個獨立事件。

下面說明為什么(rand7()-1)*7+rand7()可以構造出均勻分布在1-49的隨機數:
首先rand7()-1得到一個離散整數集合{0,1,2,3,4,5,6},其中每個整數的出現概率都是1/7。那么(rand7()-1)*7得到一個離散整數集合A={0,7,14,21,28,35,42},其中每個整數的出現概率也都是1/7。而rand7()得到的集合B={1,2,3,4,5,6,7}中每個整數出現的概率也是1/7。顯然集合A和B中任何兩個元素組合可以與1-49之間的一個整數一一對應,也就是說1-49之間的任何一個數,可以唯一確定A和B中兩個元素的一種組合方式,反過來也成立。由於A和B中元素可以看成是獨立事件,根據獨立事件的概率公式P(AB)=P(A)P(B),得到每個組合的概率是1/7*1/7=1/49。因此(rand7()-1)*7+rand7()生成的整數均勻分布在1-49之間,每個數的概率都是1/49。

程序:

  1 int rand7()
  2 {
  3     int x=0;
  4     do
  5     {
  6         x=(rand7()-1)*7+rand7();
  7     }
  8     while(x>40);
  9     return x%10+1;
 10 }
View Code

 注:由朋友問為什么用while(x>40)而不用while(x>10)呢?原因是如果用while(x>10)則有40/49的概率需要循環while,很有可能死循環了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM