标签:
还是在上次提到的数据之魅那本书,看到模拟这章,有个python模拟脚本,但书上不全,就自己简单写了下。
流程:在不同的平衡参数p(为0.5时为均匀的)下,模拟60次实验,每次投硬币8次,统计正面朝上的次数,并作图。
import random import matplotlib.pyplot as plt repeats, tosses = 60, 8 # p为平衡参数,tosses为每次重复试验中投掷硬币的次数 # 返回当前平衡参数p的情况下,8次实验中正面的次数 def heads(tosses, p): h = 0 for x in range(0, tosses): if random.random() < p: h += 1 return h x = [] # 存放平衡参数p y = [] # 存放每个p下,60次重复试验得到的h的值 p = 0 # 初始化p,从0开始 while p < 1.01: hh = [] for t in range(0, repeats): h = heads(tosses,p) # 添加微小抖动值,防止点的重叠 h += (random.random()/4)*random.choice([-1,1]) hh.append(h) #print(p,‘\t‘,heads(tosses,p)) y.append(hh) x.append(p) p += 0.05 # 箭头标注p=0.5,即硬币平衡的点 plt.plot(x,y,‘g^‘) plt.annotate(‘balence‘, xy=(0.5, 5), xytext=(0.15, 8), arrowprops=dict(facecolor=‘black‘, shrink=0.05), ) plt.show() ‘‘‘ # 一次有意思的尝试... # 开始没做出理想的图,以为一个x,对应多个y没法画(其实就是忘记点的抖动)... # 这里循环plot也是可以实现的. for i in range(60): q = [] for n in range(len(y)): yn = y[n][i] q.append(yn) plt.plot(x,q,‘ro‘) ‘‘‘
输出图形如下:
可以看到,在p=0.5,即硬币均匀的情况下,投掷后,硬币正面出现次数大部分在4的附近。
标签:
原文地址:http://www.cnblogs.com/buzhizhitong/p/5883676.html