免費開始練習
moea_joint_essay 104年 [統計資訊] 資料庫及資料探勘、程式設計

第 四 題

📖 題組:
如欲以結構化程式設計方式利用堆疊設計一簡易撲克牌遊戲發牌系統,包含洗牌、切牌及發牌,以數字 1~52 代表撲克牌 52 張牌,堆疊陣列 R[0..51]儲存代表 52 張撲克牌之數字,R[51]為底部第 52 張牌,R[0]為頂部第 1 張牌:
📝 此題為申論題,共 4 小題

小題 (四)

洗牌及切牌均須隨機從 1~52取出一數字,今有一無參數之亂數函數 rand( )可隨機傳回值K,其中 0≤ K<1,請問如何利用 rand( )隨機取出 1~52,試寫出其程式表示式。(5 分)

思路引導 VIP

rand() 產生 [0, 1) 的實數,乘以 52 將範圍展開為 [0, 52)。無條件捨去取整數後得到 0~51 的整數,再加 1 即可將範圍平移至 1~52。

🤖
AI 詳解
AI 專屬家教

可以使用取整數(下高斯/無條件捨去)的方式來完成轉換,其程式表示式如下: 取出的數字 = floor(rand() * 52) + 1 (註:在不同的程式語言中,也可寫為 int(rand() * 52) + 1,其中 int() 為無條件捨去小數點的整數轉型)。

小題 (一)

洗牌部分,先用亂數方式隨機取出上述 52 個數字其中 1 個數字(代表隨機取一張牌)以堆疊方式填入陣列 R 之底部,再繼續取下 1 個數字(下一張牌,須判斷亂數取出之數是否已被取出過,若已取過須重取)以堆疊方式依序填入陣列 R,直至 52 個數字(52 張牌)皆被取出填入陣列 R 為止,試畫出其流程圖。(5 分)

思路引導 VIP

需描述流程圖:初始化變數,使用迴圈從堆疊底部 (index 51) 裝填到頂部 (index 0);每次生成 1-52 的亂數,檢查是否重複,不重複則存入 R 並遞減 index。

🤖
AI 詳解
AI 專屬家教

流程圖步驟說明如下:

  1. 開始 (Start)
  2. 初始化陣列 R[0..51] 全為 0 (作為未填入的標記),設定堆疊指標 index = 51 (從底部開始填)。

小題 (二)

已用隨機方式選擇從陣列 R 第 20 張牌(R[19] )切牌,並開始取出發牌,請問取出發牌的順序為何?請以 R 陣列內含引數 R[i]方式表示。(5 分)

思路引導 VIP

切牌在 R[19],代表把頂端的 20 張牌 (R[0]到R[19]) 移到原本整疊牌的最底部。因此新的牌頂會是 R[20]。發牌順序將從新的牌頂開始依序至底,再接回原本被移到底部的牌。

🤖
AI 詳解
AI 專屬家教

發牌的順序為:先從 R[20] 開始發到原堆疊底部 R[51],接著再從原頂部 R[0] 發到切牌點 R[19]。 順序表示為: R[20], R[21], R[22], ..., R[51], R[0], R[1], ..., R[19]。

小題 (三)

開始發牌後,如何判斷已發牌至堆疊陣列 R 之底部,以及如何繼續取出下一張牌至整副牌發完?試以流程圖表示。(10 分)

思路引導 VIP

可以設定一變數為目前指向的陣列索引 (如 current_index = 20) 以及已發牌數 (count = 0)。發牌時判斷 current_index 是否大於 51 (底部),若超過則歸零 (繞回 R[0]),直到發牌數達到 52 為止。

🤖
AI 詳解
AI 專屬家教

流程圖步驟說明如下:

  1. 開始發牌 (Start)
  2. 初始化變數:目前索引 i = 20 (切牌後新頂部),發牌總數計數器 count = 0

🏷️ 相關主題

程式設計演算法與資料結構實作
查看更多「[統計資訊] 資料庫及資料探勘、程式設計」的主題分類考古題