继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

证明一下拉普拉斯的《概率分析论》观点

前端绅士
关注TA
已关注
手记 54
粉丝 1.6万
获赞 901
证明拉普拉斯的《概率分析论》观点Demo

必要环境

  1. Nodejs
  2. npm
  3. coffeescript的npm包工具

单一demo结构清晰如下

结构

审题与证明步骤

题目:假设有四个盒子,一个是全部黑球(0),一个是全部白球(1),剩下两个黑白球不一。依次从一个盒子随机取一个球放到下一个盒子里面,再从下一个盒子里面随机取一个球放到再下一个盒子里面,依次循环。证明当N次后,所有盒子内部的黑白球比例一致。

立题假设:每个盒子有100个球,第一个全是黑球,第二个全是白球,第三个30个黑球70个白球,第四个30个白球70个黑球。然后随机取放,打印出每次取放后相应的球比例。

代码解答环节

  1. 模拟四个盒子

    box0 = []
    box1 = []
    box2 = []
    box3 = []
  2. 相关数据配置

    boxIndex = 0 # 盒子编号
    times = 0 # 起始次数
    maxTimes = 1e3 # 转移次数
  3. 填充盒子内部的球

    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)
  4. 计算黑球,即0所占比例函数

    get0Radio = (array) ->
      array0 = array.filter((item) -> item is 0)
      (array0.length / array.length).toFixed(2)
  5. 换球操作函数,得是个递归啊

    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() # 递归
  6. 游戏开始

    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左右,至此,证明完毕。。。


完整代码如下

# 四个盒子
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() # 执行递归函数

源码相关

GitHub

CodePen

我会定期更新一下趣味Demo,有兴趣的请关注我,谢谢

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP