程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP基礎知識 >> 硬幣游戲機

硬幣游戲機

編輯:PHP基礎知識
 

假設有一硬幣游戲機,有三個硬幣出口,分別寫著“+”、“—”、“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
玩家贏的概率相當高。。。

為什麼會這樣呢?
求理論解釋。
 

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved