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,就直接放它里面了,当然访问安全要设置,我似乎别的随笔里写了安全问题,这里 ...
随机推荐
- Java中String连接性能的分析【转】
[转]http://www.blogjava.net/javagrass/archive/2010/01/24/310650.html 总结:如果String的数量小于4(不含4),使用String. ...
- c#操作IIS之IISHelper
//----------------------------------------------------------------------- // <copyright file=&quo ...
- GroupBox、TextBox、CheckBox、ToolStrip、RichTextBox、Timer控件
GroupBox:划分窗体区域,内部可以拖放组件 TextBox:可编辑文本框,也可设置为只读 属性:ReadOnly(只读).PasswordChar(密码显示的符号,如*).Multiline(多 ...
- SEO总结
学习了这么久了seo,对学过的知识进行一下总结. 服务器和域名 首先的一个就是对服务器和域名的选择,服务器最好能是独立的,因为如果不是独立服务器很容易被别人放在服务器上的网站所影响,然后就是域名,需要 ...
- 纯css美化下拉框、复选框以及单选框样式并用jquery获取到其被选中的val
具体样式如图所示: 注:获取val值时记得要先引入jquery库奥. 1.下拉框 css部分 #cargo_type_id{ font-size: 13px; border: solid 1px #b ...
- Codeforces 1101G(线性基)
题目链接 题意 将序列尽可能分成多段使得任意$x \geq 1$段内的所有元素的异或和大于$0$问最多多少段 思路 首先,如果所有元素异或和等于$0$答案显然为$-1$,否则构造整个序列的线性基,这个 ...
- 第29月第18天 mac evpp环境
1.boost https://github.com/Orphis/boost-cmake/ 2.evpp brew install libevent brew install glog /usr/l ...
- day 17 - 2 递归函数练习
1.斐波那契 问第n个斐波那契数是多少 #这个效率是低的,最好不要使用双递归 def fib(n): if n == 1 or n == 2: return 1 return fib(n-1) + ...
- ubuntu 16.04 安装 Mask_RCNN 遇到的问题集锦
源码网页(Mask R-CNN for object detection and instance segmentation on Keras and TensorFlow): https://git ...
- 第五节,python基本语法
1.类(Class) Python中的类的概念与其它语言类似,比较特殊的是protected和private在python中没有明确的限制,通常的惯例是用单下划线_表示protected,用双下划线开 ...