此算法的预期投币数量是多少?

时间:2012-01-24 23:43:57

标签: algorithm probability

假设我有一个有偏见的硬币。翻转时,产生头部的概率是4/5。

为了假装公平的折腾,我采用以下算法来模拟这种情况。假设True模型是头部,False代表尾部。

P(doUnfairFlip()= 0)= 0.8

P(doUnfairFlip()= 1)= 0.2

def fakeFairToss():
    flip1 = 0
    flip2 = 0
    while (flip1 == flip2):
        flip1 = doUnfairFlip()
        flip2 = doUnfairFlip()
    return (True if (flip1 == 0) else False)

它利用了这样一个事实:在两次硬币翻转后,人们同样可能得到头尾或尾巴。

每次这个功能运行时,我应该期待多少次这种有偏见的硬币翻转?

3 个答案:

答案 0 :(得分:4)

假设1/5^2 + 4/5^2 = 17/25 = 68%的样本为IID,则平等的几率为doUnfairFlip()

我们不是考虑每个函数调用的循环迭代,而是偶尔将这种情况视为一个无限的迭代序列"标点符号"按功能返回。请注意,当相等失败时,恰好发生函数返回,100 - 68 = 32%时间。

我们现在可以将情况标识为离散Poisson processlambda = 0.32。相应分布的平均值也是lambda:我们可以期望每次循环迭代有0.32次函数调用,或者每次调用1.0 / 0.32 = 3.125次迭代,或6.25 doUnfairFlip()次调用每次调用。

答案 1 :(得分:1)

如果你说的是那个

P(rand() % 2 = 0) = 0.8
P(rand() % 2 = 1) = 0.2

然后满足循环条件的概率是

0.8*0.8 + 0.2*0.2 = 0.68

当p = 0.68(3.125)时,您将执行循环次数与预期的失败次数一样多次。所以你应该期望运行循环3.125次,并且总共调用rand()6.25次。

答案 2 :(得分:0)

我认为它大约是1.5次运行的while循环,或3次调用rand()。我的数学可能是错的。