使用rand5()计算rand7()

时间:2014-02-28 02:17:19

标签: algorithm data-structures random

我有一个问题的解决方案,只使用rand5()生成rand7()。 其中一个解决方案是:  5 * rand5() + rand5()将以相等的概率生成数字0-24,因此我们只需要循环直到得到一个数字< 21(3 * 7)比%7在0 - 6之间得到正确答案。

我的问题是为什么我们不能只3 * rand5() + rand5()生成数字< 14(2 * 7)而不是?

3 个答案:

答案 0 :(得分:13)

如果设置X上的YS_5 = {0,1,2,3,4}independentuniformly distributed,那么

  1. 5*X + Y均匀分布在集合{0,...,24}上,但
  2. 3*X + Y未在{0,...,16}上统一分发,对{0,...,13}的限制
  3. 很容易看出(1)确实如此,因为f(x,y) = 5*x + yS_5 x S_5S_25之间的双射。

    如果我们查看3*X + Y得到的分布:

    >>> Counter(3*x + y for x in range(5) for y in range(5))
    Counter({3: 2, 4: 2, 6: 2, 7: 2, 9: 2, 10: 2, 12: 2, 13: 2, 0: 1, 1: 1, 2: 1, 5: 1, 8: 1, 11: 1, 14: 1, 15: 1, 16: 1}
    

    结果3,4,6,7,9,10,12,13的可能性是1,2,5,8或11的两倍。更多证据:

    >>> def rand7():
    ...   x = 3*rand5() + rand5()
    ...   if x < 14: return x % 7
    ...   return rand7()
    ... 
    >>> Counter(rand7() for _ in xrange(100000))
    Counter({6: 18219, 3: 18105, 4: 13734, 5: 13715, 2: 13634, 0: 13560, 1: 9033}
    

    6和3有4 / 22~18.2%的发生几率,4,5,2和0有3/22~13.6%的几率,1只有2 / 22~9.1%的几率。那是一个操纵过的骰子。

答案 1 :(得分:4)

3 * rand5() + rand5()

不均匀分布。例如,它仅以一种方式生成0,但是以两种方式生成,因此3可能比0更多。

就像2 * rand5() * rand5()4 * rand5() + rand5()

5 * rand5() + rand5()是均匀分布的。

就像生成一个base-5数字的两个随机数字一样。

00 => 0
01 => 1
02 => 2
03 => 3
04 => 4
10 => 5
11 => 6
12 => 7
...

只有一种方法可以生成0到24之间的每个数字。

答案 2 :(得分:-1)

为了获得均匀分布,两个随机数的贡献必须是独立的。这意味着一个的范围不得与另一个的范围重叠,也不得有任何间隙。

在您提出的方法中,有两种方法可以获得3例如:第一个随机数返回1,第二个返回0,或者第一个返回0,第二个返回3.这使得它发生的可能性是结果为0,只有当两个随机数均为0时才会出现。