假設有一硬幣游戲機,有三個硬幣出口,分別寫著“+”、“—”、“exchange”
每回合,當玩家按下開始按鈕後,機器內部自動投下一枚1元硬幣,假設這枚硬幣落到這三個出口的概率一樣
現游戲規則如下:
若硬幣落到“+”則該硬幣歸玩家,同時若硬幣落到出口處為正面,
機器會自動追加一枚硬幣給玩家(該硬幣不通過上述三個出口而直接給到玩家),
反面則無效果;
若硬幣落到“-”則該硬幣自動被機器重新回收,
同時若硬幣落到出口處為反面,則玩家必須返還機器一枚硬幣,
若為正面則無效果;
若硬幣落到“exchange”,機器回收此硬幣,玩家與機器交換當前擁有的硬幣。
現假設玩家有10枚硬幣,機器有5枚硬幣,請問期望中,玩家是否可以贏走所有的硬幣?如果是,那麼回合次數是幾回?
package main
import (
"fmt"
"math/rand"
"time"
)
var a int = 0;
var b int = 0;
func run() bool {
a = 10
b = 5
round :=0
for a>0 && b >0 {
//fmt.Println("round ", round);
//drop one
b --
//choose one exit. 0-2
exit := rand.Int31n(3)
//fmt.Println(exit)
switch exit {
//+
case 0:
//fmt.Println("+出口:a++")
a++
//0正 1反
if zf := rand.Int31n(2); zf ==0 {
//fmt.Println("硬幣落到出口處為正面,機器會自動追加一枚硬幣給玩家")
b--
a++
}
//-
case 1:
//fmt.Println("-出口 b++")
b++
//0正 1反
if zf := rand.Int31n(2); zf ==1 {
//fmt.Println("硬幣落到出口處為反面,則玩家必須返還機器一枚硬幣")
a--
b++
}
//exchange
case 2:
b++
//fmt.Println("交換")
a,b = b,a
default:
panic("fuck");
}
round ++;
//fmt.Printf("round End. A has %d b has %d\n", a, b)
}
//fmt.Printf("%d round End. A has %d b has %d\n", round, a, b)
if a >0 {
return true
}
return false
}
func main() {
rand.Seed(time.Now().Unix())
aWin :=0
bWin :=0
for i:=0;i<=10000000;i++ {
if run() {
aWin ++
} else {
bWin ++
}
}
fmt.Printf("ALL end. A win %d, B win %d", aWin, bWin)
}
運行一下, ALL end. A win 8531726, B win 1468275
玩家贏的概率相當高。。。
為什麼會這樣呢?
求理論解釋。