给定随机数随机生成器(7),它可以以相等的概率生成数字1,2,3,4,5,6,7(即,每个数字出现的概率是1/7)。现在我们想设计一个随机(5),它可以以相等的概率生成1,2,3,4,5(1/5)。
有一种方法:每次我们运行随机(7)时,只有在生成1-5时才返回。如果是6或7,则再次运行直到它为1-5。
我有点困惑。第一个问题是:
如何用数学方法证明每个数字出现的概率是1/5? 例如,假设返回数字1的概率是P(1)。如果B表示'所选数字在1-5'并且A表示'选择1',则根据条件概率,P(1)= P(A | B)= P(AB)/ P(B)。显然P(B)是5/7。但是如果P(1)= 1/5,P(AB)应该是1/7,为什么呢?我认为P(A)= 1/7。有什么不对吗?
第二个问题是,这个方法会一直运行,直到随机(7)没有返回6或7.如果它运行了很长时间没有返回1-5怎么办?我知道机会非常小,但有什么方法可以阻止它吗?
谢谢!
答案 0 :(得分:1)
每卷中使用 rnd(7)滚动数字 n(1..5)的概率为 1/7 。 在第一卷中获得这样一个数字的机会是5/7,或者:在所有首轮案例的 2/7中,你需要再次滚动。
当检查某个数字n(1..5)的滚动概率时,会产生系列:
p(n)= 1/7 + 2/7 *(1/7 + 2/7 *(1/7 + 2/7 *(...)))
此系列评估为 1/5 ,这是滚动特定数字n(1..5)的预期概率。
第二个问题:你有可能需要永远滚动。在x roll中得到结果的概率是 1-(2/7)^ x ,这很快接近1,所以你很可能只需几卷就可以得到一个结果,但没有保证。仍未在大量滚动中产生结果的概率变得小于在接下来的5分钟内吞噬行星的概率C'thulu,因此没有必要建立一些预防措施。如果你绝对必须,那么在n个内部滚动之后返回1,这只会略微扭曲所产生的随机数的分布。
答案 1 :(得分:1)
第一个问题的答案由基本条件概率给出:
让X
成为k
中任意{1,2,3,4,5}
的随机(7)数字:
P(X = k | X <= 5) = P(X = k)/P(X <= 5) = (1/7)/(5/7) = 1/5
这是因为观察到2个事件X = k
和X <= 5
的交集只是X = k
。
直到第一次成功(成功获得数字<= 5)的试验次数是具有p = 5/7
的几何随机变量。预期的试验次数为1/p = 7/5 = 1.4
。您将在此设置中尽快取得成功。正如@PeterWalser在他的回答中所说的那样,不能快速获得1-5范围内的数字的可能性很小。
为了好玩,您可以编写一个简短的脚本来进行调查。这是Python中的一个:
from random import randint
from collections import Counter
def trials_needed():
num = randint(1,7)
trial = 1
while num > 5:
num = randint(1,7)
trial += 1
return trial
counts = Counter(trials_needed() for i in range(10**6))
for c,i in counts.items(): print(c,":",i)
典型运行的输出:
1 : 714212
2 : 204141
3 : 58340
4 : 16515
5 : 4814
6 : 1456
7 : 347
8 : 133
9 : 28
10 : 10
11 : 4
超过99%的时间需要少于5次试验。超过10项试验极为罕见。