使用 random(7) 设计一个 random(5)

design a random(5) using random(7)

给定一个随机数生成器random(7),它可以等概率生成数字1,2,3,4,5,6,7(即每个数字出现的概率是1/7)。现在我们要设计一个随机数(5),它可以等概率(1/5)产生1,2,3,4,5。

有一种方法:每次我们运行随机(7),只有return当它产生1-5时。如果是 6 或 7,则再次 运行,直到它是 1-5。

我有点困惑。第一个问题是:

如何用数学方法证明每个数字出现的概率是1/5? 例如,假设 returned 数字 1 的概率是 P(1)。如果B表示'the selected number is in 1-5',A表示'select 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。有什么地方不对吗?

第二个问题,这个方法会运行 until random(7) 而不是return 6或者7,如果运行很长时间不是[=24怎么办? =]ing 1-5?我知道这个机会非常非常小,但是有什么办法可以避免吗?

谢谢!

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 次掷出结果的概率是 1-(2/7)^x,这很快就会接近 1,所以你 很有可能得到结果只需几卷,但不能保证。在接下来的 5 分钟内仍然没有结果的概率变得比 C'thulu 在接下来的 5 分钟内吞噬行星的概率要小,所以没有必要建立一些预防措施。如果绝对必须,那么 return 1 在 n 次内部滚动之后,这只会稍微扭曲生成的随机数的分布。

第一个问题的答案由基本条件概率给出:

X 成为随机数 (7) 然后对于 {1,2,3,4,5} 中的任何 k:

P(X = k | X <= 5) = P(X = k)/P(X <= 5) = (1/7)/(5/7) = 1/5

这是根据观察结果得出的,即 2 个事件 X = kX <= 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次试练极为罕见。