體育競技分析:模擬N場比賽
計算思維:抽象+自動化
模擬:抽象比賽過程+自動化執行N場比賽
當N越大時,比賽結果分析會越科學
比賽規則
雙人擊球比賽:A&B,回合制,5局3勝
開始時一方先發球,直至判分,接下來勝者發球
球員只能在發球局得分,15分勝一局
自頂向下(設計)
將一個總的問題表達爲若個小問題組成的形式
使用同樣方法進一步分解小問題
直至,小問題可以用計算機簡單明瞭的解決
主函數
def main():
printInfo()
probA,probB,n = getInputs()
winsA,winsB = simNGames(n,probA,probB)
printSummary(winsA,winsB)
第一階段:打印比賽提示信息
def printInfo():
print("這個程序模擬兩個選手A和B的某種競技比賽")
print("程序運行需要A和B的能力值(以0到1之間的小數表示)")
第二階段 :獲得用戶輸入
def getInpputs():
a = eval(input("請輸入選手A的能力值(0-1): "))
b = eval(input("請輸入選手B的能力值(0-1): "))
n = eval(input("模擬比賽場次: "))
return a,b,n
第四階段:打印輸出結果
def printSummary(winsA,winsB):
n = winsA+winsB
print("競技分析開始,共模擬{}場比賽".format(n))
print("選手A獲勝{}場比賽,佔比{:0.1%}".format(winsA,winsA/n))
print("選手B獲勝{}場比賽,佔比{:0.1%}".format(winsB,winsB/n))
模擬N局比賽可以作爲一個總問題來分解,分解爲模擬一局比賽並且將它循環N次
def simNGames(n,probA,probB):
winsA,winsB = 0,0
for i in range (n):
scoreA,scoreB = simOneGame(probA,probB)
if scoreA > scoreB:
winsA += 1
else:
winsB += 1
return winsA,winsB
在模擬一局比賽中,一方達到15分視爲這一局結束,所以我們可以把模擬一局比賽當作一個大問題從中分解出一個小模塊爲判斷比賽結束
def gameOver(a,b):
return a==15 or b==15
def simOneGmae(probA,probB):
scoreA,scoreB = 0,0
serving = "A"
while not gameOver(scoreA,scoreB):
if serving == "A":
if random() < probA:
scoreA += 1
else:
serving = "B"
else:
if random() < probB:
scoreB += 1
else:
serving = "A"
return scoreA,scoreB
自底向上(執行)
逐步組建複雜系統的有效測試方法
分單元測試,逐步組裝
按照自頂向下相反的路徑操作
直至,系統各部分以組裝的思路都經過測試和驗證