2014-10-01 99 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的概率。