Python抛硬币

时间:2012-07-08 03:01:29

标签: python random

我是Python新手,我无法解决这个问题。我有以下函数定义:

def FlipCoins(num_flips):
    heads_rounds_won = 0
    for i in range(10000):
        heads = 0
        tails = 0
        for j in range(num_flips):
            dice = random.randint(0,1)
            if dice==1: heads += 1
            else: tails += 1
        if heads > tails: heads_rounds_won += 1
    return heads_rounds_won

它应该做什么(但显然不是):翻转硬币num_flip次,计算头部和尾部,看看是否有更多的头而不是尾巴。如果是,请将head_rounds_won增加1.重复10000次。

我认为head_rounds_won约为5000(50%)。并且它将奇数作为输入。例如,3,5或7将产生约50%。然而,偶数会产生更低的结果,更像是34%。特别是小数字,偶数更高,例如800,差异达到50%要窄得多。

为什么会这样?不应该有任何输入产生约50%的头/尾?

2 个答案:

答案 0 :(得分:9)

你刚刚结束了很多轮次

def FlipCoins(num_flips):
    heads_rounds_won = 0
    tails_rounds_won = 0
    tied_rounds = 0
    for i in range(10000):
        heads = 0
        tails = 0
        for j in range(num_flips):
            dice = random.randint(0,1)
            if dice==1: heads += 1
            else: tails += 1
        if heads > tails: heads_rounds_won += 1
        elif heads < tails: tails_rounds_won+= 1
        else: tied_rounds += 1
    return heads_rounds_won, tails_rounds_won, tied_rounds

将返回类似

的内容
>>> FlipCoins(2)
(2506, 2503, 4991)

答案 1 :(得分:0)

这很有趣,并且(最终)证明了randint(0,1)有50/50的概率选择0或1.社区维基,因为它提供了信息,但不能直接回答问题。

s = [0, 0]
while True:
    an_int = randint(0, 1)
    s[an_int] += 1
    l = sum(s)
    print 'size: %d - %f%% zeros, %f%% ones' % (l, (100 * s[0]) / float(l), (100 * s[1]) / float(l))