扔一个公平的硬币100次并计算头数。重复此模拟10 ** 5次

时间:2017-10-10 16:03:40

标签: python distribution coin-flipping

写一个程序来模拟抛硬币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头概率的列表,我没有更高的#s,有人能告诉我我做错了吗?

  

42

     

89

     

136

     

...

     

392

     

442

     

491

4 个答案:

答案 0 :(得分:4)

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

{{1}}

答案 1 :(得分:1)

由于原始问题要求分配头数,您需要跟踪两个列表:一个用于每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)。

答案 2 :(得分:1)

您可能会注意到每次头部的头部数量大约多50个。这是因为每次循环时都不会将记录计数器重置为[]。如果添加" recordList = []"在你的print语句之后,并且使用相同的缩进,它基本上会修复你的代码。

另一种很好的方法是将100枚硬币翻转实验包裹在一个函数中,然后将函数调用10 ** 5次。您还可以使用列表理解来使一切变得简洁明了:

{{1}}

答案 3 :(得分:-1)

您可以使用所有硬币翻转模拟一个矩阵,然后在该矩阵上进行计算。

var array = $scope.myArray.split(',');