码迷,mamicode.com
首页 > 其他好文 > 详细

球队比赛预测

时间:2020-06-23 15:46:03      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:获得   else   ret   png   nts   summary   inpu   eval   while   

一,乒乓球预测:

比赛规则:(1)一局比赛:在一局比赛中,先得11分的一方为胜方:10平后,先多得2分的一方为胜方。

      (2)一场比赛:单打的淘汰赛为七局四胜制,双打淘汰赛或团体赛为五局三胜制

解答:1、将体育竞技分析分解为以下几个小步骤

1.1打印程序的介绍性信息式

1.2获得程序运行参数:probA(A的能力值),probB(B的能力值),n(比赛场次)

1.3利用球员AB的能力值,模拟n场比赛

1.4输出球员AB获胜的场次及概率

1.5用pyinstaller打包可执行文件

2、将各个步骤定义成函数来实现:

技术图片

 

 

 3.1主体函数:

1 def main():
2     printIntro()
3     probA, probB, n = printInputs()
4     winsA, winsB = simNGames(n, probA, probB)
5     printSummary(winsA, winsB)

3.2自定义函数:

 1 #打印程序介绍信息
 2 def printIntro():
 3     print("19信1 002号李源淇")
 4     print("这个程序模拟两个选手A和B的乒乓球比赛")
 5     print("程序运行需要A和B的能力值(以0到1之间的小数表示)")
 6 
 7 #获得程序运行参数
 8 def printInputs():
 9     a = eval(input("请输入选手A的能力值(0-1): "))
10     b = eval(input("请输入选手B的能力值(0-1): "))
11     n = eval(input("模拟比赛的场次: "))
12     return a, b, n
13 
14 # 进行N场比赛
15 def simNGames(n, probA, probB):
16     winsA, winsB = 0, 0
17     for i in range(n):
18         for j in range(7):           #进行7局4胜的比赛
19             scoreA, scoreB = simOneGame(probA, probB)
20             if scoreA > scoreB:
21                 winsA += 1
22             else:
23                 winsB += 1
24     return winsA,winsB
25 
26 
27  #进行一场比赛
28 def simOneGame(probA, probB):
29     scoreA, scoreB = 0, 0           #初始化AB的得分
30     serving = "A"                 
31     while not gameOver(scoreA, scoreB):     #用while循环来执行比赛
32         if scoreA==10 and scoreB==10:
33             return(simOneGame2(probA,probB))
34         if serving == "A":
35             if random() < probA:            ##用随机数生成胜负
36                 scoreA += 1
37             else:
38                 serving="B"
39         else:
40             if random() < probB:
41                 scoreB += 1
42             else:
43                 serving="A"
44     return scoreA, scoreB
45 
46 def simOneGame2(probA,probB):
47     scoreA,scoreB=10,10
48     serving = "A"
49     while not gameOver2(scoreA, scoreB):
50         if serving == "A":
51             if random() < probA:
52                 scoreA += 1
53             else:
54                 serving="B"
55         else:
56             if random() < probB:
57                 scoreB += 1
58             else:
59                 serving="A"
60     return scoreA, scoreB
61 
62 #比赛结束
63 def gameOver(a,b):               #正常比赛结束
64     return a==11 or b==11
65 def gameOver2(a,b):              #进行抢12比赛结束
66    if abs((a-b))>=2:
67        return a,b
68 
69 
70 #输出数据
71 def printSummary(winsA, winsB):
72     n = winsA + winsB
73     print("竞技分析开始,共模拟{}场比赛".format(n))
74     print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA, winsA/n))
75     print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB, winsB/n))

3.3合并:

 1 from random import random
 2 
 3 #打印程序介绍信息
 4 def printIntro():
 5     print("19信计2班23号邓若言")
 6     print("这个程序模拟两个选手A和B的乒乓球比赛")
 7     print("程序运行需要A和B的能力值(以0到1之间的小数表示)")
 8 
 9 #获得程序运行参数
10 def printInputs():
11     a = eval(input("请输入选手A的能力值(0-1): "))
12     b = eval(input("请输入选手B的能力值(0-1): "))
13     n = eval(input("模拟比赛的场次: "))
14     return a, b, n
15 
16 # 进行N场比赛
17 def simNGames(n, probA, probB):
18     winsA, winsB = 0, 0
19     for i in range(n):
20         for j in range(7):           #进行7局4胜的比赛
21             scoreA, scoreB = simOneGame(probA, probB)
22             if scoreA > scoreB:
23                 winsA += 1
24             else:
25                 winsB += 1
26     return winsA,winsB
27 
28 
29  #进行一场比赛
30 def simOneGame(probA, probB):
31     scoreA, scoreB = 0, 0           #初始化AB的得分
32     serving = "A"                 
33     while not gameOver(scoreA, scoreB):     #用while循环来执行比赛
34         if scoreA==10 and scoreB==10:
35             return(simOneGame2(probA,probB))
36         if serving == "A":
37             if random() < probA:            ##用随机数生成胜负
38                 scoreA += 1
39             else:
40                 serving="B"
41         else:
42             if random() < probB:
43                 scoreB += 1
44             else:
45                 serving="A"
46     return scoreA, scoreB
47 
48 def simOneGame2(probA,probB):
49     scoreA,scoreB=10,10
50     serving = "A"
51     while not gameOver2(scoreA, scoreB):
52         if serving == "A":
53             if random() < probA:
54                 scoreA += 1
55             else:
56                 serving="B"
57         else:
58             if random() < probB:
59                 scoreB += 1
60             else:
61                 serving="A"
62     return scoreA, scoreB
63 
64 #比赛结束
65 def gameOver(a,b):               #正常比赛结束
66     return a==11 or b==11
67 def gameOver2(a,b):              #进行抢12比赛结束
68    if abs((a-b))>=2:
69        return a,b
70 
71 
72 #输出数据
73 def printSummary(winsA, winsB):
74     n = winsA + winsB
75     print("竞技分析开始,共模拟{}场比赛".format(n))
76     print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA, winsA/n))
77     print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB, winsB/n))
78 
79 #主体函数
80 def main():
81     printIntro()
82     probA, probB, n = printInputs()
83     winsA, winsB = simNGames(n, probA, probB)
84     printSummary(winsA, winsB)
85 
86 main()

结果预测如下:

技术图片

 

 

 

 3.4打包可执行文件:

技术图片

 

 

 打包的程序在上图路径可找到:

技术图片

 

 

 

 二、采用篮球比赛规则:

(1)篮球比赛由两个队参加,每队出场5名队员。每队目标是在对方球篮得分,并阻止对方队在本方球篮得分。

(2)篮球比赛由裁判员、记录台人员和技术代表(如到场)管理。

(3)被某队进攻的球篮是对方的球篮,由某队防守的球篮是本方的球篮。

(4)在比赛时间结束时得分较多的队,将是比赛的胜者。

分析:

大体相同,自定义函数稍作改动:

 1 # 进行N场比赛
 2 def simNGames(n, probA, probB):
 3     winsA, winsB = 0, 0
 4     for i in range(n):
 5         scoreA, scoreB = simOneGame(probA, probB)
 6         if scoreA > scoreB:
 7             winsA += 1
 8         else:
 9             winsB += 1
10     return winsA,winsB
11 
12 
13  #进行一场比赛
14 def simOneGame(probA, probB):
15     scoreA, scoreB = 0, 0           #初始化AB的得分
16     serving = "A"                 
17     while not gameOver(scoreA, scoreB):     #用while循环来执行比赛
18         if serving == "A":
19             if random() < probA:            ##用随机数生成胜负
20                 scoreA += 1
21             else:
22                 serving="B"
23         else:
24             if random() < probB:
25                 scoreB += 1
26             else:
27                 serving="A"
28     return scoreA, scoreB
29 
30 
31 #比赛结束
32 def gameOver(a,b):
33     return a>b or b>a

合并后结果如下:

技术图片

 

球队比赛预测

标签:获得   else   ret   png   nts   summary   inpu   eval   while   

原文地址:https://www.cnblogs.com/zzalovelyq/p/13181856.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!