加倍下注法Martingale测试

Martingale大致意思是

地下庄家开了一个赌局:猜硬币的正反。假设你下注1元,如果猜中,你可以赢1元,如果猜错,你要输1元。
那有人想出来一个必胜法,先赌2元,赢了就收手。如果输了就赌4元。如果再输就赌8元,再输就赌16元,如此继续。这是必胜的赌博策略。

问,这个真的是赌博的必胜法吗?

知乎上有很多讨论,结论是,本金足够的情况下,是必胜的,但是收益率很低,换句话说,这样赌博是不划算的。

所以写了段代码来模拟这个问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public class TestGamble {
public static void main(String[] args) throws InterruptedException {
int win = 0;
int lose = 0;
// 赌博次数
int times = 10000;
// 赌博总收益
long money = 0;
// 单次赌博本金
long capital = 100 * 10000;
// 期望收益率
double yield = 0.1;

for (int i = 0; i < times; i++) {
long result = gamble(capital, yield);
if (result > 0) {
win++;
money += result;
System.out.println("win!! money = " + money);
} else {
lose++;
money -= capital;
System.out.println("lose!! money = " + money);
}
}
System.out.println("total win = " + win);
System.out.println("total lose = " + lose);
System.out.println("total money = " + money);
System.out.println("total yield = " + money * 1.0 / (capital * times));
}

public static long gamble(long capital, double yield) throws InterruptedException {
long original = capital;
// 下注额
long seed = 1;
while (capital > 0) {
if (dice()) {
capital += seed;
System.out.println("seed = " + seed + ", win --- " +
capital);
} else {
capital -= seed;
System.out.println("seed = " + seed + ", lose --- " + capital);
seed = Math.min(seed * 2, capital);
}
if (capital > original * (1 + yield)) {
return capital - original;
}
}
return 0;
}

public static boolean dice() {
return Math.abs((Math.random() + "").hashCode()) % 2 == 0;
}
}

测试结果如下

1
2
3
4
5
……
total win = 8544
total lose = 1456
total money = 78812408
total yield = 0.0078812408

也就是说,你准备了100亿来赌博,每次拿出100万来赌,一共赌10000次,每次赌博要么赢10%收手,要么输光。那么最终会赚7千多万,收益率0.79%,只是刚跑赢一年活期利率。把期望收益率调成50%或100%其实都差不多,只是输赢次数比例会有变化,收益率是差不多的。

总之,不划算。