证明拉普拉斯的《概率分析论》观点Demo
必要环境
- Nodejs
- npm
- coffeescript的npm包工具
单一demo结构清晰如下
注意源码包如下
审题与证明步骤
题目:假设有四个盒子,一个是全部黑球(0),一个是全部白球(1),剩下两个黑白球不一。依次从一个盒子随机取一个球放到下一个盒子里面,再从下一个盒子里面随机取一个球放到再下一个盒子里面,依次循环。证明当N次后,所有盒子内部的黑白球比例一致。
立题假设:每个盒子有100个球,第一个全是黑球,第二个全是白球,第三个30个黑球70个白球,第四个30个白球70个黑球。然后随机取放,打印出每次取放后相应的球比例。
代码解答环节
-
模拟四个盒子
box0 = [] box1 = [] box2 = [] box3 = []
-
相关数据配置
boxIndex = 0 # 盒子编号 times = 0 # 起始次数 maxTimes = 1e3 # 转移次数
-
填充盒子内部的球
box0.push(0) for i in [0..99] # 第一个盒子全是0,即黑球 box1.push(1) for i in [0..99] # 第二个盒子全是1,即白球 for i in [0..99] # 第三个盒子0占30% if i < 30 box2.push(0) else box2.push(1) for i in [0..99] # 第四个盒子1占30% if i < 30 box3.push(1) else box3.push(0)
-
计算黑球,即0所占比例函数
get0Radio = (array) -> array0 = array.filter((item) -> item is 0) (array0.length / array.length).toFixed(2)
-
换球操作函数,得是个递归啊
changeNumber = -> box = eval("box#{boxIndex}") # 获取取数的盒子 change = box.splice(Math.floor(Math.random() * 99), 1)[0] # 随机取出 boxIndex += 1 # 盒子编号加一,即下个盒子 boxIndex = 0 if boxIndex > 3 # 如果盒子编号越界,则回到第一个 box = eval("box#{boxIndex}") # 获取下一个盒子 box.splice(Math.floor(Math.random() * 99), 0, change) # 随机插入 times += 1 # 打印转以后的各个盒子0所占比例 console.log get0Radio(box0), get0Radio(box1), get0Radio(box2), get0Radio(box3) return if times > maxTimes # 如果操作次数超过设定则跳出递归 changeNumber() # 递归
-
游戏开始
changeNumber()
完整代码如下
# 四个盒子
box0 = []
box1 = []
box2 = []
box3 = []
boxIndex = 0 # 盒子编号
times = 0 # 起始次数
maxTimes = 1e3 # 转移次数
box0.push(0) for i in [0..99] # 第一个盒子全是0
box1.push(1) for i in [0..99] # 第二个盒子全是1
for i in [0..99] # 第三个盒子0占30%
if i < 30
box2.push(0)
else
box2.push(1)
for i in [0..99] # 第四个盒子1占30%
if i < 30
box3.push(1)
else
box3.push(0)
# 计算0所占比例函数
get0Radio = (array) ->
array0 = array.filter((item) -> item is 0)
(array0.length / array.length).toFixed(2)
# 移动数字
changeNumber = ->
box = eval("box#{boxIndex}") # 获取取数的盒子
change = box.splice(Math.floor(Math.random() * 99), 1)[0] # 随机取出
boxIndex += 1 # 盒子编号加一,即下个盒子
boxIndex = 0 if boxIndex > 3 # 如果盒子编号越界,则回到第一个
box = eval("box#{boxIndex}") # 获取下一个盒子
box.splice(Math.floor(Math.random() * 99), 0, change) # 随机插入
times += 1
# 打印转以后的各个盒子0所占比例
console.log get0Radio(box0), get0Radio(box1), get0Radio(box2), get0Radio(box3)
return if times > maxTimes # 如果操作次数超过设定则跳出递归
changeNumber() # 递归
changeNumber() # 执行递归函数
这里是测试1000次的结果:
1.00 0.01 0.30 0.70
1.00 0.01 0.30 0.70
1.00 0.01 0.29 0.70
1.00 0.01 0.29 0.70
1.00 0.02 0.29 0.70
1.00 0.02 0.29 0.70
1.00 0.02 0.29 0.69
1.00 0.02 0.29 0.69
1.00 0.03 0.29 0.69
1.00 0.03 0.29 0.69
...
...
...
0.48 0.54 0.54 0.44
0.47 0.54 0.54 0.44
0.47 0.54 0.54 0.44
0.47 0.54 0.54 0.45
0.48 0.54 0.54 0.44
0.48 0.53 0.54 0.44
0.48 0.53 0.54 0.44
0.48 0.53 0.54 0.45
0.49 0.53 0.54 0.44
0.48 0.53 0.54 0.44
可以尝试将1e3换成1e4甚至更高,结果只会稳定在0.50左右,至此,证明完毕。。。
我会定期更新一下趣味Demo,有兴趣的请关注我,谢谢证明一下拉普拉斯的《概率分析论》观点
注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权