3

编写一个程序,模拟抛一个公平的硬币 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

4

4 回答 4

4

这是一个带有 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)
于 2017-10-10T16:17:17.250 回答
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)

numpy然后,您可以使用您想要的任何工具(例如,matplotlib)分析/绘制人数分布。

于 2017-10-10T16:12:26.447 回答
1

您可能会注意到您的正面数量每次增加了约 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)]
于 2017-10-10T16:48:40.730 回答
0

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

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))
于 2018-08-24T13:56:44.047 回答