關於rand7 構造rand10 的問題

2021-09-22 13:01:21 字數 560 閱讀 2329

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

這類問題的解決思路無外乎是將rand7求兩遍,利用某種方法巧妙的構造出連續的一組數。上題的解決思路如下:

1. rand7執行兩次,出來的數為a1=rand7()-1,a2=rand7()-1。

2. 如果a17+a2<40,b=(a17+a2)/4+1;如果a1*7+a2>=40,重複第一步。

簡單的加減不能使用是因為加法每個結果出現的概率不同,例如:加法得到7的概率明顯高於加法得到14或者2的概率,而乘法得到的結果又不夠連續,不易得出1~10。

於是我們選擇了a1*k+a2的思路,對於k的取值問題

對於0~48出現的概率為1/49,這個很容易,因此,做a1*7+a2後出現的概率為:

4/49+(9/49)*4/49+(9/49)*(9/49)*(4/49)+......=4/49*(1/(1-9/49))=1/10
因此以上方法可以實現rand7()構造rand10()。

**:

利用rand7 構造rand10

題意 已知有個rand7 的函式,返回1到7隨機自然數,讓利用這個rand7 構造rand10 隨機1 10 參考 int rand7 intrand10 while x 40 return x 10 1 解析 要保證rand10 均勻生成1 10的隨機數,可以構造乙個0 10n的隨機數區間,這樣通...

面試題 利用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為止。...