一枚硬币如何产生1/3的概率

 38 2019-10-08 13:03:02 字数 739 阅读 20 评论 0 喜欢 0

问题一:

我想生成一个随机数,其可能的取值为(1,2,3),且概率都是1/3。
而我只有一枚硬币可以使用,该如何生成?


记正面为1,反面为2。
如果抛两次,就可以生成1-4均匀分布的随机数:

1 2
3 4

其代码为:

rand_4 = 2 * (rand2()-1) + rand2()

如果是1,2,3则返回这个数,否则重新抛。

用代码来模拟:

from random import randint

def rand2():
    return randint(1,2)

def make_rand3():
    while True:
        rand_4 = 2 * (rand2()-1) + rand2()
        if rand_4 <= 3:
            return rand_4

li = [0 for i in range(3)]
for i in range(10000000):
    li[make_rand3()-1] += 1

for i in range(3):
    print('{}:{}'.format(i+1,li[i]))

模拟一千万次后的分布为:
1: 3333642
2: 3332023
3: 3334335
可以看到分布还是很均匀的。


问题二:

问题一中,如何使抛硬币的次数尽可能小?

我们发现,在我们的策略中,每次抛两次硬币,如果结果为4,则再抛两次。
在代码中把次数也记录上,其抛硬币的次数分布如下:
抛硬币的次数分布

我们知道,需要抛n(n为偶数)次硬币的概率为:

P(n) = (\frac{1}{4})^{\frac{n}{2}-1}\times\frac{3}{4} = \frac{3}{4^{\frac{n}{2}}}

(很烦,公式不能正常显示,只能放图了)

其均值为:

E = \sum_{i=1}^{\infty}2iP(2i)=\sum\frac{6i}{4^i}=\frac{8}{3}

那么有没有更好的方法呢?

喜欢 0

发表我的评论

Hi,您需要填写昵称和邮箱!

  • 必填项

网友评论2

  1. 习大大 2020-03-14 22:56:57

    板凳

  1. 柒晨 2020-03-14 22:48:42

    沙发