歡迎來(lái)到編程的世界,如果需要理解和熟練使用循環(huán)語(yǔ)句,那么下面這個(gè)題目需要理解和完全掌握!這是一個(gè)關(guān)于擲色子的循環(huán)語(yǔ)句題目,原題目說(shuō)的是:
當(dāng)您不斷重復(fù)擲色子,并且把每次的數(shù)目相加。在這個(gè)過(guò)程中,只要擲的數(shù)字是“1”,那么所有相加得到的數(shù)字需要?dú)w零,并且需要把篩子給其他人擲。所以,為了得到最大的相加點(diǎn)數(shù),這個(gè)游戲需要采取怎樣的策略?
對(duì)于編程不熟悉的同學(xué)可能認(rèn)為很難,完全沒(méi)有頭緒;有一點(diǎn)點(diǎn)編程基礎(chǔ)的人也會(huì)認(rèn)為這道題目很麻煩,因?yàn)槿绾螖S、擲幾次才能最大的概率獲得最大的數(shù)字都是需要不斷循環(huán)才可以得到,而且這個(gè)過(guò)程似乎有一定概率無(wú)限進(jìn)行下去(雖然概率很小,但是賭博本身就是一件概率事件);對(duì)于編程牛人來(lái)說(shuō),這道題只能算基礎(chǔ)題。
所以,對(duì)于初識(shí)編程,希望在同學(xué)朋友面前展現(xiàn)自己的能力的朋友,這道題的解決會(huì)為自己加分不少。
言歸正傳,首先應(yīng)該考慮的是,這道題目里面最基礎(chǔ)的內(nèi)循環(huán)是什么?答案很簡(jiǎn)單——擲色子,并且無(wú)限制的擲下去,直到出現(xiàn)“1”停止。所以,我們可以定義一個(gè)for循環(huán)或者while循環(huán)(根據(jù)自己的喜好),這里我們把內(nèi)循環(huán)定義為while循環(huán)——
當(dāng)然還需要import一個(gè)求隨機(jī)數(shù)的包
from random import randint
while True:
x=randint(1,6)
if x==1:
summe = 0
break
else:
summe += x
print(summe)
如果剛接觸循環(huán)語(yǔ)句和編程的新手,能夠想到這里就已經(jīng)算是入門(mén)了。但是,和正道題目真正想要的東西還差了一個(gè)筋斗云的距離……首先,這只是一個(gè)人的一次嘗試,只是一次嘗試,根本就不能夠知道用何種策略才能得到最佳的次數(shù),而且這道題是一個(gè)概率題目,學(xué)過(guò)中學(xué)數(shù)學(xué)的都知道,概率都是需要很大的重復(fù)試驗(yàn)才能體現(xiàn)出來(lái)的。比如投擲硬幣,正反面分別1/2 的概率,或者擲色子每個(gè)點(diǎn)數(shù)概率1/6,這些都是大量投擲,比如1000次或者10000次或者10^6 次等才能明顯顯現(xiàn)。而且循環(huán)語(yǔ)句停下來(lái)的時(shí)候只是出現(xiàn)數(shù)字“1”的時(shí)候,所以根本就沒(méi)有用到數(shù)字“1”出現(xiàn)的概率!
所以,為了體現(xiàn)出概率的作用,剛才的一次試驗(yàn)是不能夠體現(xiàn)概率的,那么,我們要設(shè)置一個(gè)外循環(huán),讓這個(gè)循環(huán)作為一個(gè)simulator去模擬投擲色子,比如1000次。那么外部循環(huán)語(yǔ)句應(yīng)該是——
from random import randint
for a in range(1000):
summe = 0
x=0
while True:
x=randint(1,6)
if x==1:
summe = 0
break
else:
summe += x
sumAllGames += summe
print('Wuerfeln durchschnittlich erhaltende zahl ist {}'.format(sumAllGames/(a+1)))
通過(guò)這個(gè)程序可以得到1000次,知道出現(xiàn)“1”才會(huì)停止的模擬擲色子的數(shù)字,得到的平均數(shù)字是多少?但是,如果對(duì)于編程很敏感的朋友應(yīng)該看出問(wèn)題來(lái)了,這樣的出來(lái)的數(shù)有時(shí)很大有時(shí)很小,每次出來(lái)的數(shù)都是經(jīng)過(guò)1000次不斷循環(huán)擲色子得到的數(shù)字。但是,它們沒(méi)有任何規(guī)律,不管重復(fù)啟動(dòng)多少次,而且連程序員自己也不知道到底多少次擲色子才是最好的選擇。所以這個(gè)循環(huán)語(yǔ)句依然沒(méi)有意義,它的作用只是通過(guò)大量重復(fù)擲色子,顯示出概率的作用。
所以,我們還需要加第三重循環(huán)(最開(kāi)始相信除了很專業(yè)的程序員沒(méi)人能想到需要三重循環(huán)吧)?。∵@個(gè)循環(huán)我們需要告訴程序,到底多少投擲色子就夠了?也就是說(shuō),當(dāng)篩子交到某位朋友手中的時(shí)候,到底擲多少次篩子就停下來(lái),能夠最大概率得到最大的數(shù)字?所以,加了第三重循環(huán),這個(gè)語(yǔ)句應(yīng)該變成——
#stop the current game after "stopAfter" dice rolls
for stopAfter in range(1,101):
sumAllGames = 0
#simulation loop
for a in range(1000):
diceRolls = 0
summe = 0
x=0
#game loop
while True:
#roll the dice
x=randint(1,6)
if x==1:
#game lost
summe = 0
break
elif diceRolls == stopAfter:
summe +=x
break
else:
#continue playing the game
summe += x
sumAllGames += summe
print('{} male Wuerfeln durchschnittlich erhaltende zahl ist {}'.format(stopAfter, sumAllGames/(a+1)))
所以,這個(gè)程序通過(guò)給定每次投擲多少次,以此最為停止循環(huán)的標(biāo)準(zhǔn),和出現(xiàn)數(shù)字“1” 等價(jià),這樣的話我們就可以從概率的角度知道,在出現(xiàn)“1”就停止的情況下,到底投擲多少次,可以得到最大的數(shù)字!
好了,如果朋友們能夠把上面的問(wèn)題理解透徹,那么循環(huán)語(yǔ)句和編程算是入門(mén)了。如果有任何其他方法歡迎交流。循環(huán)語(yǔ)句也可以用在賭博之中,面對(duì)具體的賭博問(wèn)題,設(shè)置對(duì)象構(gòu)建循環(huán)得到最佳的策略。所以世界上的賭王都是數(shù)學(xué)非常好、心算能力非常強(qiáng)大的人,因?yàn)樗麄兡軌虬迅怕视玫綐O致,而程序員需要借助程序得到具體的數(shù)據(jù),給需要去賭博的人提供參考,也給賭場(chǎng)提供經(jīng)營(yíng)策略。再次歡迎來(lái)到編程的世界!Python 是一種面向?qū)ο髲?qiáng)大的語(yǔ)言,隨著機(jī)器學(xué)習(xí),人工智能越來(lái)越頻繁的使用,Python的應(yīng)用會(huì)更加廣泛。所以,學(xué)習(xí)編程最好直接Python開(kāi)始,而上面的例子也是使用Python做到的。就到這里,加油!