【问题标题】:Python coin-tossPython掷硬币
【发布时间】:2013-05-29 14:23:12
【问题描述】:

我是 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% 的正面/反面吗?

【问题讨论】:

  • 奇数是正面 > 反面或反面 > 正面,但如果是偶数,则有 3 种情况:正面 > 反面,反面 > 正面和正面 == 反面。在heads == tails的情况下你会怎么做?我希望随着翻转次数变大,这种情况会变得不那么频繁。这能解释你的问题吗?
  • @user1245262:(+1)。这真是个好主意
  • user1245262:是的,你是对的,我没有考虑到关系。我仍然不明白为什么奇数和偶数作为输入有如此不同的结果。例如,使用下面 Mitch 答案中的代码,输入 100 始终产生大约 8% 的平局(这不可能是正确的),而输入 99 几乎不会出现平局。
  • 安迪:奇数不能平局..;) 但是 8% 的平局是您所期望的。 Pr[50 个正面和 50 个反面] = 100 选择 50 * (0.5)^50 * (0.5)^50 = 0.079589....(我用 math.factorial(100)/(math.factorial(50)* math.factorial(50)) * math.pow(2,-100)。我希望使用 numpy 或 scipy 可以更顺畅地执行此操作,但我没有很快找到它
  • 用户:谢谢,我猜是有道理的——直觉上我会认为 8% 太多了

标签: python random


【解决方案1】:

你刚刚打了很多局

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)

【讨论】:

    【解决方案2】:

    这很有趣,并且(最终)证明了 randint(0,1) 有 50/50 的概率选择 0 或 1。社区 wiki,因为它提供了丰富的信息,但不是对问题的直接答案。

    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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多