題目:
你的程式會讓使用者輸入兩個整數s,與x,s為srand的seed,然後亂數函式產生x張牌。(不用處理重複)
每一張牌,產生1~4的亂數(代表花色,1=Spade, 2=Heart, 3=Diamond,4=Club)與一個1~13的數字(代表數值,11=J, 12=Q, 13=K, 1=A)
並印出你的牌,例如D10或是HJ,且每一張牌都需要跳行
解法:
1 | #include <iostream> |
解釋與詳細介紹
第一部分:亂數介紹
在程式中,我們有時會需要程式自動產生一個亂數。而最基本的方法之一便是使用在cstdlib標頭檔中的srand()函式。我們可以先給予程式一個seed(種子)值,讓其可以對照既有的亂數表去取亂數。這個概念有點像是,在這個函式內計有一個很長且會循環的亂數表,在選定一個”種子”後,便會決定亂數的選取開頭。而為了代表隨機性,有時候我們也會配合時間函式time()去作為種子值。並以rand()代表當下的亂數值結果。
以下列程式為例:
1 | #include <cstdlib> |
上述寫法便可以使程式產生四個不同的亂數值,而rand()的範圍在[0, RAND_MAX)中。同時這個例子中因為for迴圈的執行式只有一行,所以大括號{}可以省略(若是兩行以上的情況則不能)。
第二部分:switch/case介紹
switch/case的方式是以一個條件式做為選擇條件,並連結到不同情況的條件應對的case的程式段來執行。像此題我們就會用這個方式來一一對應隨機數與”花色”和”數值”的表現方式。
1 | switch(變數名稱或運算式) { |
要注意的是,在每個case結束後需要以一個break;作為結束。才能使程式正確執行,也就是當對應的case結束後會直接跳出程式段,而非繼續值形同段落的其他case。
第三部分:主功能解析
在這題中我們可以看到
input:整數s(seed),與x(產生牌數)
output:x個二位數,其中每數第一位代表”花色”、第二位代表”數值”,且表示規則如題目所示
這題我們先定義四個變數s,x,sym,num,且sym,num分別代表花色與數值,並以取於數的方式限定隨機數的範圍(注意在取完餘數記得+1才會是正確的結果)。並以for迴圈的方式使其能執行x遍。
1 | sym=rand()%4+1;//代表花色 |
在for迴圈主程式段中,來我們要運用到switch/case的寫法來幫助我們將隨機數對應到顯示的牌與花色代表樣子。我們先以sym作為亂數去對應了”花色”;num亂數對應”數值”
sym中:1~4的代表花色,1=Spade(S), 2=Heart(H), 3=Diamond(D),4=Club(C)
num中:1~13的數字,2~10代表對應整數,11=J, 12=Q, 13=K, 1=A)
最後在程式末端輸出換行(\n)或空格(“ “)符號作為牌與牌間的分隔。
第四部份:成果展示

這樣就可以用亂數結合程式的觀念做出自己的發牌機了!是不是很有趣呢~♪(^∇^*) 那我們明天見!
參考資料:
https://www.programiz.com/cpp-programming/library-function/cstdlib/srand
https://stackoverflow.com/questions/1619627/what-does-seeding-mean