2014-10-01 63 views
1

我正在閱讀有關從rand5()生成rand7()的問題,我似乎還不太明白。建議的解決方案顯示​​:瞭解統一的隨機數生成

 int i; 
     do 
     { 
      i = 5 * (rand5() - 1) + rand5(); // i is now uniformly random between 1 and 25 
     } while(i > 21); 
     // i is now uniformly random between 1 and 21 
     return i % 7 + 1; // result is now uniformly random between 1 and 7 

我理解的方式,但我不明白爲什麼範圍必須是從1到21,我的解決辦法是這樣的:

 int i; 
     do 
     {  
      i = (rand5()-1) + rand5(); // i is now uniformly random between 1 and 9 
     } while(i > 7); 
     // i is now uniformly random between 0 and 6 
     return i+1; 

我無法說服自己,上述方法無效。你們能否給我一個比其他人看起來更多的數字例子,使我的方法不統一?爲什麼需要5的乘數?

+0

「我現在在1到9之間是均勻隨機的」。我不認爲這是真的。有兩種方法可以生成2(1 - 1 + 2或2 - 1 + 1),但生成1(1 - 1 + 1)的方法只有一種。 – Kevin 2014-10-01 19:32:41

+0

很好的答案。我現在確信。 – 2014-10-01 19:43:10

回答

1

你們可以給我一個比其他人看起來更多的數字的例子,使我的方法不統一嗎?

當然可以。使用你的方法,接近範圍中間的數字比結束時更可能出現;例如,圖5是五倍可能出現大於1

有使1

  • 1種方式(1 - 1)+ 1 = 1

有2個的方法,使2

  • (1 - 1)+ 2 = 2
  • (2 - 1)+ 1 = 2

有3種方式讓3.

  • (1 - 1)+ 3 = 3
  • (2 - 1)+ 2 = 3
  • (3 - 1)+ 1 = 3

有4點的方法,使4

  • (1 - 1)+ 4 = 4
  • (2 - 1)+ 3 = 4
  • (3 - 1)+ 2 = 4
  • (4 - 1)+ 1 = 4

有5種方法來使5.

  • (1 - 1)+ 5 = 5
  • (2 - 1)+ 4 = 5
  • (3 - 1)+ 3 = 5
  • (4 - 1)+ 2 = 5
  • (5 - 1)+ 1 = 5

有4種方法可以製作6。

  • (2 - 1)+ 5 = 6
  • (3 - 1)+ 4 = 6
  • (4 - 1)+ 3 = 6
  • (5 - 1)+ 2 = 6

有3種方式讓7.

  • (3 - 1)+ 5 = 7
  • (4 - 1) + 4 = 7
  • (5 - 1)+ 3 = 7

有2種方法,使8.

  • (4 - 1)+ 5 = 8
  • (5 - 1)+ 4 = 8

有1點的方式,使9.

  • (5 - 1)+ 5 = 9
2

當您添加兩個均勻分佈的隨機數時,結果將不再均勻分佈。考慮結果表:

1 2 3 4 5 
    --------------- 
1 | 1 2 3 4 5 
2 | 2 3 4 5 6 
3 | 3 4 5 6 7 
4 | 4 5 6 7 8 
5 | 5 6 7 8 9 

計算表中的數目5,並計算1和9的數目。問題應該很明顯。

通過乘以一個隨機數的範圍,並添加第二個,你保持每個數字的貢獻獨立。有25種不同的結果,每種結果具有1/25的概率。