用Python模拟高尔顿钉板实验

本文介绍了使用Python模拟高尔顿钉板实验的过程,并展示了如何通过matplotlib可视化实验结果,呈现出类似正态分布的形态。
该文章已生成可运行项目,

昨天刚刚在油管上看过弗朗西斯·高尔顿的故事,今天就在CSDN上见到有人提问如何用Python模拟高尔顿钉板实验。

在这里插入图片描述

提到高尔顿,人们总是把他和钉板实验联系在一起,偶尔也会有人提及他是达尔文的表弟。实际上,作为维多利亚时代的人类学家、统计学家、心理学家和遗传学家,同时又是热带探险家、地理学家、发明家、气象学家,高尔顿简直就是一位集大成者。

高尔顿钉板形如上图所示:木板上钉有锥形排列的多层钉子,每颗钉子的水平位置正好位于下一层的两颗钉子正中间;小球在下落的过程中碰到钉子之后,可能从左边滚落,也可能从右边滚落,概率都是1/2;穿过m-1层钉板后,小圆球最终会落入下方的m个容器的某一个中。

这个实验之所以有名,是因为实验结果服从正态分布。不过也有人说,高尔顿钉板的实验结果服从二项分布,只是二项分布的概率密度函数可以用正态分布近似而已,和正态分布没什么关系。我不懂数学,只好把两种说法都罗列在这里,供读者参考。

好了,明白了高尔顿钉板的原理,就该程序员一展身手了。先定义一个函数,实现小球穿过m-1层钉板后落到m个容器的某一个中,容器编号从0开始。

>>> import random
>>> def galton(m):
	pos = 0
	for i in range(1, m):
		if random.random() > 0.5:
			pos += 1
	return pos

>>> galton(9)
4
>>> galton(9)
5
>>> galton(9)
4
>>> galton(9)
4
>>> galton(9)
2

这样测试太慢了,我们干脆把测试次数n也传到函数中。

>>> def galton(m, n):
	result = [0 for i in range(m)]
	for i in range(n):
		pos = 0
		for j in range(1, m):
			if random.random() > 0.5:
				pos += 1
		result[pos] += 1
	return result

>>> galton(9, 100)
[0, 7, 13, 19, 30, 19, 10, 2, 0]

看起来的确很像正态分布的样子。我们不妨用matplotlib画出多条曲线看看,这次是14层钉板1000个小球,测试3次。

>>> import matplotlib.pyplot as plt
>>> for i in range(3):
	plt.plot(galton(15, 1000))

	
[<matplotlib.lines.Line2D object at 0x0000020938174D88>]
[<matplotlib.lines.Line2D object at 0x000002093817FF08>]
[<matplotlib.lines.Line2D object at 0x0000020938185708>]
>>> plt.show()

结果如下图所示。实验完成。
在这里插入图片描述

本文章已经生成可运行项目
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天元浪子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值