看了個視頻:《散戶炒股票為啥總賠錢?李永樂老師用數學告訴你原因~》(https://weibo.com/3325704142/Gecagg1CK)
根據視頻中得出的結論,寫了小段代碼認證下結論是否正確,經過認證,還真是如此,奇幻!
大概就是,兩人拋硬幣對賭,規則如下:
1)A=正面 B=正面 :A贏3;
2)A=反面 B=反面 :A贏1;
3)其他情況:B贏2;
一個看似公平的游戲,但是如果A將出A面的幾率控制在 1/3 ~ 2/5的時候,B贏錢的幾率會接近於0~
大家可以在這個在線代碼(https://tour.golang.org/)運行網站中測試下下面這個代碼:
package main
import (
"fmt"
"math/rand"
"time"
)
var min, max float64
func RandomInt(max int) int {
rand.Seed(time.Now().UnixNano())
return rand.Intn(max) + 1
}
func manT() int {
return RandomInt(2)
}
// 1:正面 2:反面
func womanT() int {
//先獲取一個概率,概率在 1/3 ~ 2/5 之間
var p float64
for p < min || p > max {
p = float64(RandomInt(100)) / 100.0
}
//fmt.Printf("Probability: %.2f\n", p)
//將概率*100,得到一個分水嶺數字,比如35
var P int = int(100 * p)
//然后隨機獲取一個數字
//如果大於P(比如:35),那么拋出反面(2);反之拋出正面(1)
v := RandomInt(100)
if v > P {
return 2
}
return 1
}
func main() {
min, max = 1.0/3.0, 2.0/5.0
fmt.Println(min, max)
wm := make(map[int]int)
var man_money int = 0
var woman_money int = 0
for i := 0; i < 100; i++ {
n1 := womanT()
n2 := manT()
wm[n1]++ //記錄美女所拋硬幣
switch {
case n1 == 1 && n2 == 1:
man_money += 3
woman_money -= 3
case n1 == 2 && n2 == 2:
man_money += 1
woman_money -= 1
default:
man_money -= 2
woman_money += 2
}
}
fmt.Println("玩了100次,美女拋出 '正面' 和 '反面' 的次數和概率如下:")
fmt.Printf("正面 次數:%d 概率: %.2f\n", wm[1], float64(wm[1])/100.0)
fmt.Printf("反面 次數:%d 概率: %.2f\n", wm[2], float64(wm[2])/100.0)
fmt.Println("男子和美女所得金額如下:")
fmt.Println("Man: ", man_money)
fmt.Println("Woman: ", woman_money)
}

跑了幾次,只要美女控制住概率,發現果然都是美女在贏錢!
