文章首发于:Panda's Blog
本篇文章将通过Python模拟一个案例来映射散户与庄家之间的博弈
目录
- 目录
- 文章
- 故事引入
- 通过数学方法证明
- 简单分析
- 仔细分析
- 李永乐老师的分析
- 通过 Python 模拟对局证明
- 源码
- 实现逻辑
- 1°
- 2°
- 3°
- 结论
- 映射
- 股市里如何才能稳赚钱
文章
故事引入
有一天,有一个男人坐在酒吧里独自喝酒,遇到一个美女,提议和男人玩一个掷硬币的游戏,两人分别有一枚硬币,两人可以任意决定自己硬币的正反面,然后同时打开自己的硬币给对方看。
游戏规则:
- 两个硬币都是正面的,男人赚3元
- 两个硬币都是反面的,男人赚1元
- 两个硬币不相同面,男人输2元
通过数学方法证明
简单分析
站在男人的角度分析,这场游戏可以简化为以下表格

简单计算一下男人一局游戏的数学期望
这样看来,貌似这是一个公平的游戏,但是随着游戏进行,男人却发现自己一直在输钱,难道只是因为女人的运气比较好?
仔细分析
设:
- 男子掷出正面的概率为 x
- 女子掷出正面的概率为 y
则可得出
- 男子掷出反面的概率为 1-x
- 女子掷出反面的概率为 1-y

此时男人一局游戏的数学期望则为
若女人能采取某种策略使得E(man)永远小于0,则男人一直输钱
合并同类项得到
解出这个不等式
1°
当
时:
∵
∴
∵是减函数,且x,y∈[0,1]
∴ 当x取最大值时,
2°
当
时:
∵
∴
∵是减函数,且x,y∈[0,1]
∴ 当x取最小值时,
结合1°和2°
当
时,
所以当女人出正的概率在1/3到2/5之间时,无论男人怎么出,最后都必输无疑
李永乐老师的分析
传送门:BV1zs411779z
通过Python模拟对局证明
源码
import random
class Player:
def __init__(self):
# 初始金币
self.money = 500
# 默认正面概率
self.prob_front = 0.5
# 玩家名
self.name = ''
# 选择正反面
def choose(self):
if (self.prob_front <= 1) & (self.prob_front >= 0):
if random.random() < self.prob_front:
return 'front'
else:
return 'back'
class Game:
def __init__(self):
# i - 游戏局数
self.i = 0
# winner - 赢家
self.winner = None
def start(self, player1, player2):
while True:
if (player1.money >= 2) & (player2.money >= 3):
# 游戏开始
player1Choose = player1.choose()
player2Choose = player2.choose()
# 当选择不相同时,player1输钱
if player1Choose != player2Choose:
# player1输2
player1.money -= 2
player2.money += 2
# 当选择相同时,player1赚钱
else:
# 同正
if (player1Choose == 'front') & (player2Choose == 'front'):
# player1赚3
player1.money += 3
player2.money -= 3
# 同反
elif (player1Choose == 'back') & (player2Choose == 'back'):
# player1赚1
player1.money += 1
player2.money -= 1
self.i += 1
# print(player1.name + ':' + str(player1.money))
# print(player2.name + ':' + str(player2.money) + '\n')
else:
if player1.money < 2:
self.winner = player2
else:
self.winner = player1
return self.i
def main():
sumOfPlayer1Win = 0
sumOfGame = 0
# 游戏迭代次数
t = 500
for x in range(t):
# 玩家1
player1 = Player()
player1.name = 'man'
# 玩家1出正的概率
player1.prob_front = 0.5
# 玩家2
player2 = Player()
player2.name = 'women'
# 玩家2出正的概率
player2.prob_front = 0.5
g = Game()
i = g.start(player1, player2)
winnerObj = g.winner
winner = winnerObj.name
print('持续了'+str(i)+'局,赢家是'+str(winner))
if winnerObj.name == player1.name:
sumOfPlayer1Win += 1
sumOfGame += i
print('统计:\n'+player1.name+'获胜次数'+str(sumOfPlayer1Win))
print(player2.name + '获胜次数' + str(t-sumOfPlayer1Win))
print('平均结束局数' + str(sumOfGame/t))
if __name__ == '__main__':
main()
实现逻辑
- 游戏开始至 一名玩家的钱不足以开始下一次对局为一次游戏
- 游戏开始给与两名玩家相同的钱
- 两名玩家可以设置自己此次游戏的出正概率
1°
当两个玩家都有500元(money),出正的概率(prob_front)都为0.5时,迭代500(t)次看看结果

可以发现,此时游戏看起来似乎是“公平”的,双方输赢都差不多
2°
那么当女人带着策略时(正的概率在1/3到2/5之间)
两个玩家都有500元(money),女人出正的概率(player2.prob_front)为0.36,男人出正的概率(player1.prob_front)为0.5时,迭代500(t)次看看结果

男人输了500次精光
3°
如果男人每次的出正概率都为随机呢?
两个玩家都有500元(money),女人出正的概率(player2.prob_front)为0.36,男人出正的概率(player1.prob_front)为随机数(random.random())时,迭代500(t)次看看结果

结果并没什么变化
结论
当女人出正的概率在1/3到2/5之间时,无论男人怎么出,最后都必输无疑
映射
如果把
- 女人比作股市里的庄家,硬币正反面比作打压股价和拉升股价
- 男人比作股市里的散户,硬币正反比作买多和买空
此时规则可以简化为以下表格

表面上貌似有跌有涨,散户是有赚到钱的可能
而事实上庄家可以通过一定的策略,让散户一直亏钱
股市里如何才能稳赚钱
变成庄家
