Python 将一枚普通硬币掷100次,并计算人头数。重复此模拟10**5次

Python 将一枚普通硬币掷100次,并计算人头数。重复此模拟10**5次,python,distribution,coin-flipping,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()

编写一个程序,模拟投掷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)))
但是每次我运行我的程序时,我没有得到一个10万个人头的列表,而是得到了更高的概率,有人能告诉我我做错了什么吗

42

89

136

392

442

491


由于最初的问题要求分配人头数,因此需要跟踪两个列表:一个是每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
)分析/绘制人头计数的分布。

这是一个使用numpy的版本,允许您更优雅地生成随机数,因为您还可以指定大小属性

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)

您可能会注意到,您的头数每次增加约50个。这是因为每次循环时不会将记录计数器重置为[]。如果您在print语句之后直接添加“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)]

你可以用你所有的硬币来模拟一个矩阵,然后在这个矩阵上进行计算

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

在两次试验之间,您从不重置
recordList
。我喜欢您的答案,您能在我的代码中实现您使用的numpy代码片段吗?因为我是python新手,我不知道在哪里对我的代码进行更改并添加
experiments
numpy代码片段实际上是整个代码块的替代品。查看文档以了解更多信息。因此,所有10^5个实验的每100次投掷试验中的头数存储在变量
experiments
中。唯一的区别是它的数据类型是
numpy.ndarray
而不是
list
。您可以使用
experiments=list(experiments)
将其转换为list。