⏰前言
不知不覺今天已通過去大半,本覺得昨天就能更新的文章今天的這個時候纔開始碼字。今天總結兩個項目:猜數字和預測機率。編程可讓人明白一些道理,甚至讓你以爲看似不相關的隨機數其實也是有被預測的可能,那麼接下來就來玩一玩這兩組代碼吧!python
😝猜數字
假設Joe的年齡是18歲,她被詢問年齡時不想直接作出直接的回答,但出於禮貌又有必要告訴對方,因而Joe想寫一個程序,經過給出提示讓別人猜想。這裏就要用到while
語句來構造這樣一個程序。編程
joe_age = 18 guess = int(input(">>:")) while guess != joe_age: if guess > joe_age: print("猜的太大了,往小試試……") elif guess < joe_age: print("猜的過小了,往大試試……") guess = int(input(">>:")) print("恭喜你,猜對了!")
while
循環不一樣於for
循環就在於它能夠無限循環,咱們不能知道要猜多少次,因此while
循環更加適合這樣的場景。框架
guess = int(input(">>:"))
同時也用到if
和elif
條件判斷語句:dom
if guess > joe_age: print("猜的太大了,往小試試……") elif guess < joe_age: print("猜的過小了,往大試試……") guess = int(input(">>:")) print("恭喜你,猜對了!")
當猜想年齡大於實際年齡,打印「猜的太大了,往小試試……」,當猜想年齡小於實際年齡,打印「猜的過小了,往大試試……」,當猜想年齡等於實際年齡,打印"恭喜你,猜對了!"程序運行結果以下圖所示: 函數
🏆獲勝機率預測
場景以下: 1.小A和小B羽毛球比賽,小A每球獲勝機率55%,小B每球獲勝機率45%; 2.每局比賽,先得21分者獲勝; 3.假設進行10000局比賽,兩人分別會獲勝多少局? 首先構造頂層框架:code
def main(): #主要邏輯 prob_A, prob_B, number_of_games = get inputs() #獲取原始數據 win_A, win_B = sim_n_games(prob_A, prob_B, number_of_games) #獲取模擬結果 print_summary(win_A, win_B, number_of_games) #結果彙總輸出
def main()
定義函數main
, prob_A
小A每球獲勝機率,prob_B
小B每球獲勝機率,number_of_games
比賽場數。經過以上參數,再得到兩人分別贏多少局 win_A, win_B
。最後進行彙總輸出print_summary
。orm
錄入原始數據
def get_inputs(): #輸入原始數據 prob_A = eval(input("請輸入運動員A的每球獲勝機率(0~1):")) prob_B = round(1-prob_A, 2) #2人比賽,1-prob_A = prob_B number_of_games = eval(input("請輸入模擬比賽場數(正整數):")) print("模擬比賽場數:", number_of_games) print("小A每球獲勝機率:", prob_A) print("小B每球獲勝機率:", prob_B) return prob_A, prob_B, number_of_games #每一次return語句出現表明調用函數結束 prob_A, prob_B, number_of_games = get_inputs() print(prob_A, prob_B, number_of_games)
多場比賽模擬
進行多場比賽模擬( score_A, score_B
是得到比分,其中一人到達 21循環中止:blog
def sim_n_games(prob_A, prob_B, number_of_games): #定義sim_n_games函數 #模擬多場比賽的結果 win_A, win_B = 0, 0 #初始化A和B獲勝的場次 for i in range(number_of_games): #迭代number_of_games次,如下是模擬一場比賽,for循環一萬次 score_A, score_B = sim_one_game(prob_A, prob_B) #得到模擬比賽的比分 if score_A > score_B: win_A +=1 else: win_B +=1 return win_A, win_B
單次比賽狀況模擬
而後咱們再進行簡化,把多場比賽簡化成模擬一場比賽,再進行10000次循環:get
import random def sim_one_game(prob_A, prob_B): #模擬一場比賽的結果 score_A, score_B = 0,0 while not game_over(score_A, score_B): #這裏用到while循環 if random.random() < prob_A: score_A +=1 else : score_B +=1 return score_A, score_B
注意上面代碼中 if random.random() < prob_A:
隨機數據小於小A每球獲勝機率的55%,則A獲勝一次,此處須要用心理解。input
彙總輸出
def print_summary(win_A, win_B, number_of_games): print("共模擬了{}場比賽" .format(number_of_games)) #模擬總場次 print("選手A獲勝{0}場,佔比{1:.1%}" .format(win_A, win_A/number_of_games)) #A獲勝的機率除以總場次乘以100% print("選手B獲勝{0}場,佔比{1:.1%}" .format(win_B, win_B/number_of_games)) #B獲勝的機率除以總場次乘以100%
最終造成程序
import random def get_inputs(): #輸入原始數據 prob_A = eval(input("請輸入運動員A的每球獲勝機率(0~1):")) prob_B = round(1-prob_A, 2) #2人比賽,1-prob_A = prob_B number_of_games = eval(input("請輸入模擬比賽場數(正整數):")) print("模擬比賽場數:", number_of_games) print("小A每球獲勝機率:", prob_A) print("小B每球獲勝機率:", prob_B) return prob_A, prob_B, number_of_games #每一次return語句出現表明調用函數結束 #prob_A, prob_B, number_of_games = get_inputs() #print(prob_A, prob_B, number_of_games) def game_over(score_A, score_B): #單場模擬結束條件是一方得到21分 return score_A == 21 or score_B == 21 def sim_one_game(prob_A, prob_B): #模擬一場比賽的結果 score_A, score_B = 0,0 while not game_over(score_A, score_B): if random.random() < prob_A: score_A += 1 else : score_B += 1 return score_A, score_B def sim_n_games(prob_A, prob_B, number_of_games): #定義sim_n_games函數 #模擬多場比賽的結果 win_A, win_B = 0, 0 #初始化A和B獲勝的場次 for i in range(number_of_games): #迭代number_of_games次,如下是模擬一場比賽,for循環一萬次 score_A, score_B = sim_one_game(prob_A, prob_B) #得到模擬比賽的比分 if score_A > score_B: win_A += 1 else: win_B += 1 return win_A, win_B def print_summary(win_A, win_B, number_of_games): print("共模擬了{}場比賽" .format(number_of_games)) #模擬總場次 print("選手A獲勝{0}場,佔比{1:.1%}" .format(win_A, win_A/number_of_games)) #A獲勝的機率除以總場次乘以100% print("選手B獲勝{0}場,佔比{1:.1%}" .format(win_B, win_B/number_of_games)) #B獲勝的機率除以總場次乘以100% def main(): #主要邏輯 prob_A, prob_B, number_of_games = get_inputs() #獲取原始數據 win_A, win_B = sim_n_games(prob_A, prob_B, number_of_games) #獲取模擬結果 print_summary(win_A, win_B, number_of_games) #結果彙總輸出 if __name__ == "__main__": main()
到此,整個程序運行完畢,代碼中的註釋部分須要認真閱讀。
👍小結
兩個小案例的練習,讓我以爲真的是每個簡單的自動化執行背後都是無數的辛酸。社會大分工後讓人們的專業愈來愈細,愈來愈專,普羅大衆漫不經心地使用機器進行自動化高效工做,卻不知越是高效、便捷、傻瓜式的智能,說明背後越是有人付出時間和精力幫助你完成更多要考慮到的事情。極客萬歲!另外,機率分析這個案例,單個球的輸贏機率A和B相差無幾,但屢次比賽下來卻出現驚人的差距,正所謂「失之毫釐,差之千里啊!」
下章再見!🙋♀️ > 未經溝通轉載,將追究法律責任,請尊重原創勞動成果!