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,就直接放它里面了,当然访问安全要设置,我似乎别的随笔里写了安全问题,这里 ...
随机推荐
- AHOI2019N省联考凉凉记
博主并未时空穿越,本文没有对选手造成恐慌 DAY0 这已经是我第四次省选了,时间真快啊,怀念三年前毫无压力的省选,考完以后如果有时间并且没退役的话可能会陆续搬以前写在别处的游记(主要是2018年的游记 ...
- vsftpd启动问题简记
centos7 能以ipv6方式启动,启动只需修改配置如下 如需同时启动到ipv4跟ipv6,需拷贝配置文件,一份配置中只监听ipv4,一份配置中只监听ipv6 centos6中无法启动到ipv6,错 ...
- JQuery对象关系图
上图转自:http://www.cnblogs.com/haogj/archive/2010/04/19/1715762.html 自定义函数示例: $.fn.jAccordionunfold = f ...
- Django小技巧——使用package管理app
在一个学习视频上看见的小技巧,遂记录下来. 1. 如下图所示,项目中有多个app,本技巧要解决的问题是集中管理这多个app,将其放入一个package下集中管理,改善项目的视图环境 2. 建立一个pa ...
- webpack学习记录 二
开发网站 用polyfill(全局污染) 开发框架 用Runtime(局部污染) 在.babelrc文件中
- css布局中的百分比布局
1.在说到百分比是前,先简单了解下基本的单位 英寸(inch) :in 1 in=2.54cm厘米(centimeter):cm毫米(millimeter):mm磅(point):pt 1pt=1/7 ...
- 【算法】【python实现】二叉树深度、广度优先遍历
二叉树的遍历,分为深度优先遍历,以及广度优先遍历. 在深度优先遍历中,具体分为如下三种: 先序遍历:先访问根节点,再遍历左子树,再遍历右子树: 中序遍历:先遍历左子树,再访问根节点,再遍历右子树: 后 ...
- Mac ---- markdown 转 html\word\pdf
在Mac上,有一个软件,叫iA writer,是一个文字编辑器,可以进行md到word的转换,但它是收费的,RMB68元. 如果只是临时用一下,不想购买,你可以使用pandoc. 在mac下,使用方法 ...
- 【原创】大叔问题定位分享(2)spark任务一定几率报错java.lang.NoSuchFieldError: HIVE_MOVE_FILES_THREAD_COUNT
最近用yarn cluster方式提交spark任务时,有时会报错,报错几率是40%,报错如下: 18/03/15 21:50:36 116 ERROR ApplicationMaster91: Us ...
- Python虚拟环境的安装与使用
通过virtualenv创建 首先安装virtualenv:pip3 install virtualenv 安装完成之后cd到合适的目录下键入命令: virtualenv 虚拟环境名称 (创建纯净的虚 ...