一,简介

田忌赛马的故事大家都知道我就不展开说了,田忌能用同全面被碾压的马赢了齐威王(公子),我觉得这是十分具有智慧的。但是,如果说这里的条件改为:1,田忌的马比齐威王同等次的马弱一点但是比齐威王下一等次的马强一点。2,无法从对方马的外观看出马的等次。3,用完的马不能再用。问田忌赢了齐威王的概率是多少?

二,实验设计

1,首先,三局两胜制,我们这里把田忌3局里赢的场数算出来。

  我们初始化马用list中值的大小来比较马的能力,可见田忌的马相对于公子的马来说辣鸡不少。

  t = [2, 5, 8]  #田忌的马
  g = [3, 6, 9] #公子的马

   用完的马不能再次上场(马也要休息啊),那么每次比完的马就从list中remove掉,得出:

 # 田忌公子博弈策略
def tianji_gongzi(): #田忌千场胜利次数
winer_perchang = [] #每场的胜者
t = [2, 5, 8]
g = [3, 6, 9]
N = 2
for i in range(0,3):
para1 = random.randint(0,N) #这里设置N是因为list变短了,randint随机范围变小了
para2 = random.randint(0,N)
N = N -1
#print(t[para1],g[para2])
if t[para1] > g[para2]:
#print("田忌胜")
winer_perchang.append(1)
else:
#print("公子胜")
pass
t.remove(t[para1])
g.remove(g[para2]) return len(winer_perchang)

这里主要讲的是俩人的对战策略,都是随机从自己的马棚找马出来应战,最终返回的值是3局里田忌赢的场数(winer_perchang),注意这里的“N=2”是因为remove之后就没两个了,所以用“

N = N -1”来设置一下。

2,田忌每1000次能赢多少次?

这里的参数“times”我设置的是1000,就是说比了1000场(不考虑马累死哈),每场比3局,调用“tianji_gongzi()”函数把每场田忌赢的局数返回回来,当田忌每场赢了2局或者以上证明忌哥这场赢了,就加入到list“
win_timesfor_t”中,这里用“len(win_timesfor_t)”表示这1000场里田忌赢得场次,并返回这个数。
 def t_win_persouthand(times):
win_timesfor_t = [] #田忌赢的次数的记录
for i in range(0,times):
a = tianji_gongzi()
if a >= 2:
#print("返回值", a) # 田忌每场胜利的次数
win_timesfor_t.append(a)
#print("每times次田忌赢的次数为:",len(win_timesfor_t))
return len(win_timesfor_t)

3,每1000场田忌赢得场数算出来了,接下来就算100个1000场的数据(马是真的累)

调用函数“t_win_persouthand(times)”得到1000场胜利场数,再循环100次让他们再比100个1000场,得到100个千场胜率,最后将数据画出来。

 if __name__ == '__main__':
y_pait = []
n = 100 #实验次数
y_pait = paint(n)
#print(y_pait)
x_pait = []
for i in range(1,n+1):
x_pait.append(i)
#print(x_pait) sum = 0
for i in y_pait:
sum = sum + i
average = sum/n
print('田忌每 ',n,' 次模拟的千场胜率为:',average/10,"%") plt.plot(x_pait,y_pait, label='NM')
# plt.plot(x2, y2, label='Second Line')
plt.xlabel('Iterations') # 横坐标标题
plt.ylabel('Win_times per 1000 iterations') # 纵坐标标题
# plt.title('Interesting Graph\nCheck it out',loc="right") #图像标题
plt.title('Paragraph for hourse strategy')
plt.legend() # 显示Fisrt Line和Second Line(label)的设置
plt.savefig('C:/Users/zhengyong/Desktop/1.png')
plt.show()

  这里又调用了“t_win_persouthand(times)”中return的“return len(win_timesfor_t)”,然后加入list并画图。

  最后我们计算出了100个千场平均胜率,说白了就是比了100000场,让马跑这么多次也主要是为了结果精确。

  注意,这里是好几次嵌套调用,要注意哈。

全部代码:

 import random
import matplotlib.pyplot as plt # 田忌公子博弈策略
def tianji_gongzi(): #田忌千场胜利次数
winer_perchang = [] #每场的胜者
t = [2, 5, 8]
g = [3, 6, 9]
N = 2
for i in range(0,3):
para1 = random.randint(0,N) #这里设置N是因为list变短了,randint随机范围变小了
para2 = random.randint(0,N)
N = N -1
#print(t[para1],g[para2])
if t[para1] > g[para2]:
#print("田忌胜")
winer_perchang.append(1)
else:
#print("公子胜")
pass
t.remove(t[para1])
g.remove(g[para2]) return len(winer_perchang) def t_win_persouthand(times):
win_timesfor_t = [] #田忌赢的次数的记录
for i in range(0,times):
a = tianji_gongzi()
if a >= 2:
#print("返回值", a) # 田忌每场胜利的次数
win_timesfor_t.append(a)
#print("每times次田忌赢的次数为:",len(win_timesfor_t))
return len(win_timesfor_t) #t_win_persouthand(1000)
def paint(N):
win_times = []
for i in range(0,N): #这里要100个数据
b = t_win_persouthand(1000)
win_times.append(b)
#print(win_times) #list中装的是没times(这里是1000)次田忌赢的次数
return win_times if __name__ == '__main__':
y_pait = []
n = 100 #实验次数
y_pait = paint(n)
#print(y_pait)
x_pait = []
for i in range(1,n+1):
x_pait.append(i)
#print(x_pait) sum = 0
for i in y_pait:
sum = sum + i
average = sum/n
print('田忌每 ',n,' 次模拟的千场胜率为:',average/10,"%") plt.plot(x_pait,y_pait, label='NM')
# plt.plot(x2, y2, label='Second Line')
plt.xlabel('Iterations') # 横坐标标题
plt.ylabel('Win_times per 1000 iterations') # 纵坐标标题
# plt.title('Interesting Graph\nCheck it out',loc="right") #图像标题
plt.title('Paragraph for hourse strategy')
plt.legend() # 显示Fisrt Line和Second Line(label)的设置
plt.savefig('C:/Users/zhengyong/Desktop/1.png')
plt.show()

三,结果

以上是模拟出来的结果图示,下面是概率。

四,总结

  总体来说,代码很简单,就是练练手,几个变量的全局性考虑下,循环时候remove注意下就好了。

  算了几次,基本上是15.5-15.8之间吧,折痕容易联想到六分之一,具体是不是我们以后验证哈。

  

  增订一下数学解法:

第三种方法:穷举法,这个其实也不多,读者自己可以试试看。

数学方法只是验证一下我们通过随机数的分布概率得到的结果,大家可以通过修改参数看看小样本下是怎样的情况。

python田忌赛马的更多相关文章

  1. 【LeetCode】870. Advantage Shuffle 解题报告(Python)

    [LeetCode]870. Advantage Shuffle 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn ...

  2. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  3. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  4. Python 小而美的函数

    python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况   any any(iterable) ...

  5. JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议

    软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...

  6. 可爱的豆子——使用Beans思想让Python代码更易维护

    title: 可爱的豆子--使用Beans思想让Python代码更易维护 toc: false comments: true date: 2016-06-19 21:43:33 tags: [Pyth ...

  7. 使用Python保存屏幕截图(不使用PIL)

    起因 在极客学院讲授<使用Python编写远程控制程序>的课程中,涉及到查看被控制电脑屏幕截图的功能. 如果使用PIL,这个需求只需要三行代码: from PIL import Image ...

  8. Python编码记录

    字节流和字符串 当使用Python定义一个字符串时,实际会存储一个字节串: "abc"--[97][98][99] python2.x默认会把所有的字符串当做ASCII码来对待,但 ...

  9. Apache执行Python脚本

    由于经常需要到服务器上执行些命令,有些命令懒得敲,就准备写点脚本直接浏览器调用就好了,比如这样: 因为线上有现成的Apache,就直接放它里面了,当然访问安全要设置,我似乎别的随笔里写了安全问题,这里 ...

随机推荐

  1. tf.reducemean()到底是什么意思?

    https://blog.csdn.net/he_min/article/details/78694383 在tensorflow中经常见到reducemean这个api,到底有什么用,到底是对谁求均 ...

  2. ASP.NET知识点汇总

    一 ,html属性20181113常用的居中方法1 text-align2 float3 margin (margin-left matgin-right margin-bottom margin-t ...

  3. 【Sql Server】SQL SERVER 递归查询

    SQL SERVER 2005之前的版本只能用函数方法实现,SQL SERVER 2005之后新增了CTE功能,可以利用CTE实现递归查询: CTE:公用表达式Common Table Express ...

  4. [再寄小读者之数学篇](2014-11-02 Herglotz' trick)

    设 $f$ 是 $\bbR$ 上周期为 $1$ 的连续可微函数, 满足 $$\bee\label{141102_f} f(x)+f\sex{x+\frac{1}{2}}=f(2x),\quad\for ...

  5. [物理学与PDEs]第5章习题3 第二 Piola 应力张量的对称性

    试证明: 在物质描述下, 动量矩守恒定律等价于第二 Piola 应力张量的对称性. 证明: 由 $$\beex \bea \int_{G_t}\rho\sex{{\bf y}\times\cfrac{ ...

  6. 原生js封装cookie获取、设置及删除

    使用cookie(key,value,options) 参数key,value,options(可选) function cookie(key,value,options){ if(typeof va ...

  7. JS中小数相加相减时出现很长的小数点的解决方式

    1.问题: 平时写的代码中会出现这种情况,parseFloat(11.3-10.1) 运行的结果依然是1.200000000000001 代码示例: var arr = [0.0111,11.002, ...

  8. 设计模式四: 抽象工厂(Abstract Factory)

    简介 抽象工厂模式是创建型模式的一种, 与工厂方法不同的是抽象工厂针对的是生产一组相关的产品, 即一个产品族. 抽象工厂使用工厂方法模式来生产单一产品, 单一产品的具体实现分别属于不同的产品族. 抽象 ...

  9. 基于VC的MFC界面开发

    教你熟悉VC6.0创建一个可视化软件的过程 UpdateData(TRUE);//将输入数据赋给文本框变量. UpdateData(FALSE);//将内容显示在文本框中 AfxMessageBox( ...

  10. docker简单介绍---网络端口管理

    一.查看docker支持的网络类型 docker network ls bridge:容器使用虚拟交换机的进行通信 host:使用宿主机的网络 none:只给容器分配一个lo的网卡,无法和外界进行通信 ...