我有一个问题的解决方案,只使用rand5()生成rand7()。
其中一个解决方案是:
5 * rand5() + rand5()
将以相等的概率生成数字0-24,因此我们只需要循环直到得到一个数字< 21(3 * 7)比%7在0 - 6之间得到正确答案。
我的问题是为什么我们不能只3 * rand5() + rand5()
生成数字< 14(2 * 7)而不是?
答案 0 :(得分:13)
如果设置X
上的Y
和S_5 = {0,1,2,3,4}
为independent且uniformly distributed,那么
5*X + Y
均匀分布在集合{0,...,24}
上,但3*X + Y
未在{0,...,16}
上统一分发,对{0,...,13}
的限制很容易看出(1)确实如此,因为f(x,y) = 5*x + y
是S_5 x S_5
和S_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时才会出现。