題目:假設有四個盒子,一個是所有黑球(0),一個是所有白球(1),剩下兩個黑白球不一。依次從一個盒子隨機取一個球放到下一個盒子裏面,再從下一個盒子裏面隨機取一個球放到再下一個盒子裏面,依次循環。證實當N次後,全部盒子內部的黑白球比例一致。立題假設:每一個盒子有100個球,第一個全是黑球,第二個全是白球,第三個30個黑球70個白球,第四個30個白球70個黑球。而後隨機取放,打印出每次取放後相應的球比例。git
模擬四個盒子github
box0 = [] box1 = [] box2 = [] box3 = []
相關數據配置npm
boxIndex = 0 # 盒子編號 times = 0 # 起始次數 maxTimes = 1e3 # 轉移次數
填充盒子內部的球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)
計算黑球,即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()
測試
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
# 四個盒子 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,有興趣的請關注我,謝謝