Python 将一枚普通硬币掷100次,并计算人头数。重复此模拟10**5次
编写一个程序,模拟投掷100次硬币,并计算人头数。重复此模拟10**5次,以获得人数分布 我写了下面的代码来计算100次磁头的数量,外部循环应该重复我的函数100K次以获得磁头的分布: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()
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。