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


    代码地址如下:
    http://www.demodashi.com/demo/13558.html

    证明拉普拉斯的《概率分析论》观点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()

    完整代码如下

    # 四个盒子
    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,有兴趣的请关注我,谢谢证明一下拉普拉斯的《概率分析论》观点

    代码地址如下:
    http://www.demodashi.com/demo/13558.html

    注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

  • 相关阅读:
    (Vue中)cehart在同一个dom上画图图切换时饼图有折线图的坐标系
    linux(centos7)修改服务器时间
    centos6 yum源不能使用
    Linux 使用 history 来减少重复命令的几个实用技巧。
    7个Shell 拿来就用脚本实例!
    keepalived的配置解析&安装与爬坑
    linux最全命令使用手册
    linux各种误删文件恢复方法(经典强推)
    位运算符
    SQL 书写、执行顺序
  • 原文地址:https://www.cnblogs.com/demodashi/p/9443524.html
Copyright © 2020-2023  润新知