看了个视频:《散户炒股票为啥总赔钱?李永乐老师用数学告诉你原因~》(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 ", 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 ", wm[1], float64(wm[1])/100.0) fmt.Printf("反面 次数:%d 概率: %.2f ", wm[2], float64(wm[2])/100.0) fmt.Println("男子和美女所得金额如下:") fmt.Println("Man: ", man_money) fmt.Println("Woman: ", woman_money) }
跑了几次,只要美女控制住概率,发现果然都是美女在赢钱!