『經濟學家薩謬森問同事是否願意賭一次擲硬幣,可以贏二百美元或輸一百美元。同事說:「我不會賭,因為我對輸一百美元的擔心比贏二百美元的期待更大。如果體讓我連續賭一百次,我就願意。」
為什麼人們會覺得只賭一次勝算不高,連續賭一百次就會對自己有利呢?這個問題不容易回答。沒錯,賭越多次,你贏的可能性越高;但是反過來想,當你賭越多次,你損失的金額也會越大。』
這是麥可‧路易斯所寫的《橡皮擦計畫》中的一個小故事。
那天睡前躺在床上,就想到可以想一個程式來擲硬幣嗎?
最先想到的就是捉取一個輸入的數值來當作丟擲硬幣的次數:
var inputNum = document.getElementById("countId").value;//將正面sideA與sideB的初始數值設為0
var sideA = 0;
var sideB = 0;
然後再將輸入的數字inputNum的字串透過parseInt轉為數字countNum,放入for迴圈當條件。
至於switch中的參數 r,則是用Math.random() * 2,產生2以內的隨機數,再用Math.ceil()無條件進位取整數,也就只會產生1與2兩個數值,用1代表正面,2代表反面。
for (var i = 1; i <= countNum; i++) {
var r = Math.ceil(Math.random() * 2);
switch (r) {
case 1:
sideA++;
break;
case 2:
sideB++;
break;
default:
console.log("不是正面,也不是反面");
}
}
本來是用if…else…來寫正面與反面的滿足條件,但是後來發現只有正面(1)反面(2)兩種狀態的情境很適合switch的寫法,所以改用效能更好的switch。
然後印出執行次數:
console.log("正面" + sideA + "次");
console.log("反面" + sideB + "次");
實做出來的擲硬幣程式放在這裡: