作者:l675015956l
时间:2018年7月15日
来源:CSDN
在网上看到了一个有意思的话题”中国股市适合散户吗?”,有人举了一个美女和男士博弈的例子,这个例子表面看上去,胜负的概率各占50%,但是经过一些数学推算,发现经过多次博弈后,美女总是能够稳赢!
这个结论对我的冲击比较大,让我对自己的直觉产生了怀疑.理论归理论,我们能不能使用事实来模拟证明一下呢?找人来模拟这个博弈貌似不现实,作为程序员,很快就想到了使用程序来模拟.
我们分三步走,第一步:分析例子. 第二步:书写代码. 第三步:测试模拟.
第一步,分析例子:美女和男士玩硬币的故事.
规则是这样的,美女和男士各自有一个硬币,两人可以选择出硬币的正面或反面.如果两人的硬币都是正面,男士将获得3元,如果两人的硬币都是反面,男士将获得1元.如果两人的硬币一正一反,那么男士将失去2元.男士的收益图如下图所示
表面一看,上面每种情况出现的概率都是1/4, 所以最终男士得到的奖励为 0.25 * 3 + 0.25 * 1 – 0.25 * 2 -0.25 *2 = 0, 不赢不输嘛~
但是经过分析,如果美女把控好出硬币正面的概率,那么不管男士怎么调整出硬币正面的概率,经过多次博弈后,男士都会输! 这个分析过程略复杂,也不是本次要关注的重点,感兴趣的话,可以看视频里面的分析过程.我们暂且先记住结论:只要美女出正面的概率在(1/3,2/5)之间,那么男士就会一直输钱. (貌似好神秘的样子)
第二步 , 书写代码 :
因为过程比较简单,使用C,java,python都可以进行模拟.那就选择开发比较快的python吧.
# -*- coding: utf-8 -*-
import random
def girl_result(probality_of_girl):
probality=random.random()
if probality < probality_of_girl:
return “正面”
else :
return “反面”
def boy_result(probility_of_boy):
probality=random.random()
# print(probality)
if probality < probility_of_boy:
return “正面”
else:
return “反面”
def game_gambing(times,probility_of_boy,probality_of_girl):
money = 0
for i in range(times):
temp_result =girl_result(probality_of_girl)
if temp_result == boy_result(probility_of_boy):
if temp_result == “正面”:
money += 3
else :
money += 1
else :
money += -2
return money
if __name__ == ‘__main__’:
for j in range(1,10):
game_times = 10000
probality_of_girl = round(0.9,2)
result_money =game_gambing(game_times,round(0.1*j,2),probality_of_girl)
print(“女人出正面的概率为 “+str(probality_of_girl)+”,第”+str(j)+”个男人出正面的概率为”+str(round(0.1*j,2))+”,博弈次数为: “+str(game_times)+” 他赢得的钱为: “+str(result_money))
第三步 , 测试 :
按照结论,我们在1/3和2/5之间取一个数,比如0.37,如果美女一直以这个概率来出正面,那么多次博弈后,应该会稳赢.
假设有9个不同概率偏好的男士来进行博弈,他们出正面的的概率分别为0.1到0.9,分别博弈10000次.博弈结果如下:
为了进一步验证程序的正确性,我们可以调整美女出正面的概率,比如调成0.1,那么理论上来说,男人出正面的概率越低,,越容易赢到钱,因为这意味着在多数情况下,两人出的都是反面,看一下模拟的结果:
如果美女出正面的概率偏大,比如0.9,那么男人出正面的概率越大,越容易赢到钱,因为这意味着在多数情况下,两人出的都是正面,看一下模拟结果:
证明完毕~
感触:学好数学真的很重要.
https://blog.csdn.net/l675015956l/article/details/81050649
http://btc.mom/8724/