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,就直接放它里面了,当然访问安全要设置,我似乎别的随笔里写了安全问题,这里 ...
随机推荐
- 剑指Offer_编程题_21
题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. class Solution { public: void push(int value) { st.push(val ...
- SpringBoot中Application开启与关闭
0.声明 缘由:没有学过或者没有经历SpringBoot的Application运行机制的话,一定会好奇,博主为啥会写一篇关闭开启的博文,是不是好幼稚?(/o(╥﹏╥)o),待我娓娓道来......为 ...
- 使用Notepad++开发Java程序
安装NppExec插件(已安装可跳过) 插件下载地址 我选择了最新的RC2 根据软件位数下载对应的版本,我直接下载了32位对应的dll 解压后里面有两个文件夹和一个dll文件 拷贝到Notepad++ ...
- 使用HttpClient和WebRequest时POST一个对象的写法
[一]步骤: 1)将对象转化为Json字符串. 2)将Json字符串编码为byte数组. 3)设置传输对象(WebRequest或者HttpClient)的ContentType是"appl ...
- Django REST Framework API Guide 07
本节大纲 1.Permissions 2.Throttling Permissions 权限是用来授权或者拒绝用户访问API的不同部分的不同的类的.基础的权限划分 1.IsAuthenticated ...
- Spring系列(一) Spring的核心
Spring 简介 Spring 是一个开源轻量级企业应用架构,目的是为了简化企业级应用开发.(1)Spring 框架可以帮我们管理对象的生命周期,帮助我们管理对象间的依赖关系,相互协作:(2)Spr ...
- workqueue --最清晰的讲解【转】
转自:https://www.cnblogs.com/zxc2man/p/6604290.html 带你入门: 1.INIT_WORK(struct work_struct *work, void ( ...
- get/post比较
转载: https://www.oschina.net/news/77354/http-get-post-different https://www.cnblogs.com/wswang/p/6054 ...
- nginx: 应用访问默认采用https
主要配置如下: #静态文件的访问 server { listen 443 ssl; server_name static.jksfrz.com; ssl_certificate d:/app/ngin ...
- 【python】md5加密方法相关使用
md5方法在hashlib库中,使用前需要先导入.它的主要方法为update,copy,以及转换为二进制,十六进制. 用法说明: Help on HASH object: class HASH(bui ...