C++入門基礎系列:走進資訊學奧賽,如何產生隨機數?
2023-01-25由 向陽花開滿山紅 發表于 農業
c++如何生成隨機數列表
隨著人工智慧、大資料等新一輪科技革命和產業變革的深入推進,
計算機科學基礎教育的人才選拔與培養逐漸受到重視。
01
學習計劃&目標
對於
零基礎且初中及以下階段(參加普及組)
的資訊學愛好者,如果
數學基礎還比較紮實
,可以嘗試這樣安排學習計劃:
第一階段:
掌握C++基礎語法
,包括:輸入輸出、條件分支、迴圈等內容;
第二階段:
掌握C++進階語法
,包括:陣列、字串、函式、遞迴、結構體、排序等內容;
第三階段:
初賽前,學習計算機基礎知識,簡單資料結構與演算法、簡單組合數學等,考前真題訓練。
目標
:爭取在普及組複賽中做出
1
道題。
進入本文的主題:
C++中,如何產生隨機數?
02
如何產生隨機數?
分三步驟,第1、2步為固定語法格式;第3步根據題目具體要求編寫表示式。
需要引入兩個標頭檔案:cstdlib、ctime;
在程式開頭處編寫固定格式(產生隨機種子):srand(time(NULL));這樣能夠保證程式每次執行時,隨機數都不同。
在需要產生隨機數的地方呼叫rand()函式,構造表示式即可。
資訊學奧賽課課通(C++)
¥
64。6
京東
購買
03
案例一:產生一個0-10之間的隨機數
rand()函式會產生一個隨機數,但並沒有確定範圍。如何獲取一個給定範圍的隨機數呢?
在這段程式碼中,只需要讓rand()函式取10的餘數,即可得到一個小於10之內的整數。注意:標頭檔案、產生隨機種子程式碼的編寫。
04
案例二:猜數字遊戲
產生一個1-50之間的隨機整數,只有5次猜測機會。解析:
1、在這個問題中,需要產生1-50之間的隨機數。可以考慮rand()函式去取50的餘數,但得到的只是0-49之間的數;如何得到想要的範圍?
注意觀察:只需要在前面程式碼的基礎上加個1即可,即:
rand()%50+1。
拓展,如果要產生25-50之間的隨機數,應該怎麼改寫上述程式碼呢?
請思考通用解決思路(文末給出答案)。
2、題目要求只有5次的猜測機會,需要考慮使用迴圈。C++中提供了while、do-while及for迴圈,可根據熟練度及喜好自行選用。建議選用for迴圈,因為這是具有明確次數的迴圈,使用比較方便簡潔。
參考程式碼如下:
上述程式碼中,在for迴圈中進行條件判斷,動態獲取使用者的猜測值guess變數,然後與隨機數num進行比較,根據比較結果提示相應的操作。
如果五次之內猜測正確,則“恭喜使用者”並順利結束程式;如果超過五次也沒有猜測出來,則提示“已經沒有機會了”。
05
案例三:猜拳遊戲
這個經典的案例在之前的教學文章、影片裡都有講過,分別用到了C、Java、Python等程式語言實現。本文就以C++的語法來實現其過程。
首先,我們必須有一個基本的思路。因為是和電腦出拳,所以可以這樣實現:
顯示介面(略)
使用者出拳(動態賦值)
電腦出拳(產生隨機數)
判斷勝負
顯示介面這塊由學習者按照個人喜好,自行設計遊戲介面,此處略寫。然後,看使用者出拳部分,採用C++中的
switch條件
結構可以實現,程式碼如下:
前面已經講了隨機數的產生方式,按照固定模式編寫程式碼即可。產生一個1-3之間的隨機數
rand()%3+1
,然後將數字轉換成文字輸出,同樣可以借用前面的switch結構,程式碼如下:
最後一步,就是根據使用者出拳的數字和電腦產生的隨機數進行比較,判斷勝負。這一步的程式碼就留個讀者自行完成了。(可參考作者其他教學資料)
06
總結
本文主要講解了在C++中如何產生隨機數。
1、如果只給出最大值,則:rand()%最大值;如:產生10以內的隨機數,rand()%10即可。
2、如果給出最小、最大值,則:rand()%(最大值-最小值)+最小值;如:產生10-30之間的隨機數,表示式就該這樣寫:rand()%(30-10)+10。
今天的內容你都掌握了嗎?歡迎關注
想了解更多精彩內容,快來關注向陽花開滿山紅