題意
已知有個rand7()的函式,返回1到7隨機自然數,讓利用這個rand7()構造rand10() 隨機1~10
參考**
intrand7()
intrand10()
while(x > 40
);
return x % 10 + 1
;}
解析
要保證rand10()均勻生成1~10的隨機數,可以構造乙個0~10n的隨機數區間,這樣通過rand10n()%10+1就是所求。
現在目標轉移到生成rand10n()。如果不能生成正好rand10n(),可以通過生成rand10n+m()通過捨棄多餘的m來獲得rand10n()。
現在目標轉移到生成rand10n+m()。
乙個可行的方法
rand7() 得到隨機數rand7()-1 得到隨機數 -------集合a
(rand7()-1)*7 得到隨機數 -------集合b
(rand7()-1)*7+rand7() 得到隨機數+
由於a和b中元素可以看成是獨立事件,根據獨立事件的概率公式p(ab)=p(a)p(b),得到每個組合的概率是1/7*1/7=1/49,生成概率集合為1~49。
關於rand7 構造rand10 的問題
已知有個rand7 的函式,返回1到7隨機自然數,讓利用這個rand7 構造rand10 隨機1 10。這類問題的解決思路無外乎是將rand7求兩遍,利用某種方法巧妙的構造出連續的一組數。上題的解決思路如下 1.rand7執行兩次,出來的數為a1 rand7 1,a2 rand7 1。2.如果a17...
面試題 利用rand7模擬rand10
已知有個rand7 的函式,返回1到7隨機自然數,讓利用這個rand7 構造rand10 隨機1 10。rand7只能為1 7之間的數,如何讓他模擬1 10間的數呢?肯定要通過概率性的公式進行換算才行!首先想到的是將其擴大,擴大到多少合適呢?一想想7的倍數,還是10的倍數,想想覺得50左右即可,所以...
資料結構與演算法 rand7 生成rand10
rand7 隨機生成1 7的數字。那麼如何有rand7構建rand10?大致思路有兩種 1 捨棄法 大多數都是這麼叫的。意思是如果有了大的生成小的,可以直接把多與的捨棄掉重新rand。舉個例子,如果有了rand10,如何得到rand7?n rand10,如果n 7,重新rand10,直到n 7為止。...