證實一下拉普拉斯的《機率分析論》觀點

證實拉普拉斯的《機率分析論》觀點Demo

必要環境

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

單一demo結構清晰以下

結構

審題與證實步驟

題目:假設有四個盒子,一個是所有黑球(0),一個是所有白球(1),剩下兩個黑白球不一。依次從一個盒子隨機取一個球放到下一個盒子裏面,再從下一個盒子裏面隨機取一個球放到再下一個盒子裏面,依次循環。證實當N次後,全部盒子內部的黑白球比例一致。

立題假設:每一個盒子有100個球,第一個全是黑球,第二個全是白球,第三個30個黑球70個白球,第四個30個白球70個黑球。而後隨機取放,打印出每次取放後相應的球比例。git

代碼解答環節

  1. 模擬四個盒子github

    box0 = []
    box1 = []
    box2 = []
    box3 = []
  2. 相關數據配置npm

    boxIndex = 0 # 盒子編號
    times = 0 # 起始次數
    maxTimes = 1e3 # 轉移次數
  3. 填充盒子內部的球dom

    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() # 執行遞歸函數

源碼相關spa

GitHubcode

CodePen遞歸

我會按期更新一下趣味Demo,有興趣的請關注我,謝謝
相關文章
相關標籤/搜索