【问题标题】:Tossing a fair coin for 100 times and count the number of heads. Repeat this simulation 10**5 times投掷一枚公平的硬币 100 次,然后数正面的数量。重复此模拟 10**5 次
【发布时间】:2018-03-22 02:54:02
【问题描述】:

编写一个程序来模拟掷硬币 100 次并计算正面的数量。重复此模拟 10**5 次以获得人头数的分布。

我写了下面的代码来计算头数 100 次,外循环应该重复我的函数 100K 次以获得头的分布:

import random
def coinToss():
    return random.randint(0, 1)

recordList = []

for j in range(10**5):

    for i in range(100):
        flip = coinToss()
        if (flip == 0):
            recordList.append(0)

    print(str(recordList.count(0)))

但是每次我运行我的程序时,我得到的不是 100K 正面概率的列表,而是没有更高的结果,谁能告诉我我做错了什么?

42

89

136

....

392

442

491

【问题讨论】:

  • 您永远不会在两次试验之间重置recordList

标签: python distribution coin-flipping


【解决方案1】:

这是一个带有 numpy 的版本,它可以让您更优雅地生成随机数,因为您还可以指定 size 属性。

import numpy as np


n_sim = 10
n_flip = 100

sims = np.empty(n_sim)
for j in xrange(n_sim):
    flips = np.random.randint(0, 2, n_flip)
    sims[j] = np.sum(flips)

【讨论】:

    【解决方案2】:

    由于最初的问题要求头数分布,因此您需要跟踪两个列表:一个是每 100 次试验的正面数,另一个是当前 100 次试验中的正面数.

    import random
    def coinToss():
        return random.randint(0, 1)
    
    experiments = [] # Number of heads per 100-toss experiment
    
    for j in range(10**5):
        cnt = [] # Number of heads in current 100-toss experiment
        for i in range(100):
            flip = coinToss()
            if (flip == 0):
                cnt.append(0)
        experiments.append(cnt.count(0))
        print(str(cnt.count(0)))
    

    但是,我强烈建议使用 numpy 之类的方式执行此操作,这将大大提高性能。你可以用numpy一行来做到这一点:

    import numpy as np
    experiments = np.random.binomial(n=100, p=0.5, size=10**5)
    

    然后,您可以使用所需的任何工具(例如numpymatplotlib)分析/绘制人数分布。

    【讨论】:

    • 我喜欢你的回答,你能在我的代码中实现你使用 numpy 的代码片段吗,因为我是 python 新手,我不知道在哪里对我的代码进行更改并添加 @ 987654328@
    • numpy 代码 sn-p 实际上是您整个代码块的替代品。查看numpy.random.binomial 的文档。因此,所有 10^5 次试验的每次 100 次抛掷试验中正面的数量存储在变量 experiments 中。唯一的区别是它的数据类型是numpy.ndarray 而不是list。您可以使用experiments = list(experiments) 将其转换为列表。
    【解决方案3】:

    您可能会注意到每次正面朝上的次数增加了约 50 次。这是因为您不会在每次循环时将记录计数器重置为 []。如果您在打印语句之后直接添加“recordList = []”并使用相同的缩进,它基本上会修复您的代码。

    另一种很好的方法是将 100 次掷硬币实验包装在一个函数中,然后调用该函数 10**5 次。您还可以使用列表推导使一切变得简洁明了:

    import random
    
    def hundred_flips():
        result = sum([random.randint(0, 1) for i in range(100)])
        return result
    
    all_results = [hundred_flips() for i in range(10**5)]
    

    【讨论】:

      【解决方案4】:

      您可以模拟一个包含所有硬币翻转的矩阵,然后对矩阵进行计算。

      from numpy import mean, std
      from numpy.random import rand
      N_flip = int(1e5)
      N_trials = int(1e2)
      coin_flips = rand(N_flip, N_trials) > 0.5
      p = mean(coin_flips, axis=0) # Vector of length N_trials with estimated probabilites
      print('Mean: %3.2f%%, Std: %3.2f%%' % (mean(p)*100, std(p)*100))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-10
        • 1970-01-01
        • 1970-01-01
        • 2019-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-04
        相关资源
        最近更新 更多