python田忌赛马
一,简介
田忌赛马的故事大家都知道我就不展开说了,田忌能用同全面被碾压的马赢了齐威王(公子),我觉得这是十分具有智慧的。但是,如果说这里的条件改为: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田忌赛马的更多相关文章
- 【LeetCode】870. Advantage Shuffle 解题报告(Python)
[LeetCode]870. Advantage Shuffle 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn ...
- Python中的多进程与多线程(一)
一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- Python 小而美的函数
python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况 any any(iterable) ...
- JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议
软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...
- 可爱的豆子——使用Beans思想让Python代码更易维护
title: 可爱的豆子--使用Beans思想让Python代码更易维护 toc: false comments: true date: 2016-06-19 21:43:33 tags: [Pyth ...
- 使用Python保存屏幕截图(不使用PIL)
起因 在极客学院讲授<使用Python编写远程控制程序>的课程中,涉及到查看被控制电脑屏幕截图的功能. 如果使用PIL,这个需求只需要三行代码: from PIL import Image ...
- Python编码记录
字节流和字符串 当使用Python定义一个字符串时,实际会存储一个字节串: "abc"--[97][98][99] python2.x默认会把所有的字符串当做ASCII码来对待,但 ...
- Apache执行Python脚本
由于经常需要到服务器上执行些命令,有些命令懒得敲,就准备写点脚本直接浏览器调用就好了,比如这样: 因为线上有现成的Apache,就直接放它里面了,当然访问安全要设置,我似乎别的随笔里写了安全问题,这里 ...
随机推荐
- 题解-洛谷P1981 表达式求值(模拟+处理优先级的递归)
https://www.luogu.org/problemnew/show/P1981 (原题链接) 显然乘法的优先级高与加法,因此碰到乘号就要优先把一连串与乘号相连的数算出,很容易想到递归.可用普通 ...
- python 爬虫之beautifulsoup(bs4)环境准备
环境准备: bs4安装方法:https://blog.csdn.net/Bibabu135766/article/details/81662981 requests安装方法:https://blog. ...
- Ubuntu16下Hive 安装
0.安装环境和版本 Ubuntu16,hadoop版本是2.7.2 ,选择Hive版本为 hive-2.1.17 1. Hive安装包下载 地址: https://mirrors.tuna.tsin ...
- 关于设计项目UI界面的软件工具
关于画UI界面的软件,我在网上找了几个,今天式用这几款软件还可以 1.墨刀:国产的,这个专门画APP界面的,用起来比较简单,有免费版的,要注册才能用,提供云存储,收费版的云存储空间会多一些.网站: h ...
- JGUI源码:解决手机端点击出现半透明阴影(4)
下面开始进入正题,问题发现与解决 1.According解决手机浏览器点击出现半透明阴影 手机下点击有白色蒙版,原始效果如下,看起来很不协调 2.解决办法:增加 -webkit-tap-highlig ...
- [物理学与PDEs]第4章第1节 引言
1. 本章讨论可燃流体在流动过程中同时伴随着燃烧现象的情况. 2. 燃烧有两种, 一种是爆燃 (deflagration): 火焰低速向前传播, 此时流体微元通常是未燃气体.已燃气体的混合物; 一 ...
- [物理学与PDEs]第3章第2节 磁流体力学方程组 2.3 磁流体力学方程组
1. 磁流体力学方程组 $$\beex \bea \cfrac{\p {\bf H}}{\p t} &-\rot({\bf u}\times{\bf H})=\cfrac{1}{\sigma ...
- H5取经之路——HTML的基本标签
一.head中的基本标签 1.HTML文档的结构: a.<head>头部部分,b.<body>主体部分 <!DOCTYPE html> <!-- ↑为 ...
- vue组件化的应用
前言:vue组件化的应用涉及到vue-cli的内容,所以在应用之前是需要安装node和vue-cli的,具体如何安装我就不一一赘述了.可能一会儿我心情好的时候,可以去整理一下. 1.应用的内容:在一个 ...
- 残差网络ResNet笔记
发现博客园也可以支持Markdown,就把我之前写的博客搬过来了- 欢迎转载,请注明出处:http://www.cnblogs.com/alanma/p/6877166.html 下面是正文: Dee ...