参考教材《Python编程导论》第15章随机程序、概率和分布,第17章抽样和置信区间
In [1]: import random
In [2]: def rollDie():
...: return random.choice([1,2,3,4,5,6])
...:
In [8]: random.choice(('N','T'))
Out[8]: 'N'
In [3]: rollDie()
Out[3]: 3
In [4]: def rollN(n):
...: result = ''
...: for i in range(n):
...: result = result + str(rollDie())
...: print(result)
...:
In [5]: rollN(100)
4644532166235321621544123622461126365231421534331361666212521532344115436511543415536226132222556624
In [11]: def flip(numFlips):
...: """假设numFlips是一个正整数"""
...: heads = 0
...: for i in range(numFlips):
...: if random.choice(('H', 'T')) == 'H':
...: heads += 1
...: return heads/numFlips
...: def flipSim(numFlipsPerTrial, numTrials):
...: """假设numFlipsPerTrial和numTrials是正整数"""
...: fracHeads = []
...: for i in range(numTrials):
...: fracHeads.append(flip(numFlipsPerTrial))
...: mean = sum(fracHeads)/len(fracHeads)
...: return mean
...:
In [12]: flipSim(10, 1)
Out[12]: 0.5
In [13]: print('Mean =', flipSim(10, 1))
Mean = 0.6
In [14]: print('Mean =', flipSim(10, 1))
Mean = 0.6
In [15]: print('Mean =', flipSim(10, 1))
Mean = 0.2
In [16]: print('Mean =', flipSim(10, 1))
Mean = 0.4
In [17]: print('Mean =', flipSim(10, 100))
Mean = 0.49400000000000005
In [18]: print('Mean =', flipSim(10, 100))
Mean = 0.522
In [19]: print('Mean =', flipSim(100, 100000))
Mean = 0.5000537000000042
In [20]: print('Mean =', flipSim(100, 100000))
Mean = 0.5001523000000002
In [22]: import pylab
In [23]: def regressToMean(numFlips, numTrials):
...: #获取每次实验(抛掷numFlips次硬币)中正面向上的比例
...: fracHeads = []
...: for t in range(numTrials):
...: fracHeads.append(flip(numFlips)) #注意这里调用的是前面的函数flip()
...: #找出具有极端结果的实验,以及这些实验的下一次实验
...: extremes, nextTrials = [], []
...: for i in range(len(fracHeads) - 1):
...: if fracHeads[i] < 0.33 or fracHeads[i] > 0.66:
...: extremes.append(fracHeads[i])
...: nextTrials.append(fracHeads[i+1])
...: #绘制结果
...: pylab.plot(range(len(extremes)), extremes, 'ko',
...: label = 'Extreme')
...: pylab.plot(range(len(nextTrials)), nextTrials, 'k^',
...: label = 'Next Trial')
...: pylab.axhline(0.5)
...: pylab.ylim(0, 1)
...: pylab.xlim(-1, len(extremes) + 1)
...: pylab.xlabel('Extreme Example and Next Trial')
...: pylab.ylabel('Fraction Heads')
...: pylab.title('Regression to the Mean')
...: pylab.legend(loc = 'best')
...:
In [24]: regressToMean(15, 40)

均值回归.png