考試軟體需求:每次出題順序不同、題目數量可配置、且不可重複。C++ 標準庫 rand() 無現成支援,故封裝通用擴展函數 randEx(int MAX, int NUM)。
time(&t) 設定隨機種子,確保每次序列不同NUM 個隨機數do-while 檢查新數是否與已產生數重複RAND[] (1-based 索引)void randEx(int MAX, int NUM) {
int k = 0, j = 0;
time_t t;
srand((unsigned)time(&t)); // 設定種子
for (k = 1; k <= NUM; k++) { // 1-based 索引
RAND[k] = rand() % MAX; // 0 ~ MAX-1
do {
for (j = 1; j < k; j++) {
if (RAND[j] == RAND[k]) { // 發現重複
RAND[k] = rand() % MAX;
break; // 跳出內層 for,do-while 繼續檢查
}
}
} while (j < k); // 若 j==k 表示無重複,結束 do-while
}
}
class CTestRandDlg : public CDialog {
public:
int RAND[20]; // 足夠容納最大需求
void randEx(int MAX, int NUM);
CWnd* p_StaticWnd;
// ...
};
void CTestRandDlg::OnTestrand() {
UpdateData(TRUE);
randEx(m_nRandMax, m_nRandNum); // 使用者輸入最大值與數量
CString str;
for (int i = 1; i <= m_nRandNum && i <= 10; i++) {
str.Format(_T("%d"), RAND[i]);
p_StaticWnd = GetDlgItem(IDC_STATIC1 + i - 1);
p_StaticWnd->SetWindowText(str);
}
UpdateData(FALSE);
}
測試環境:VC++ 6.0 + Windows XP,編譯通過。
rand() 週期短,關鍵應用建議用 std::mt19937 (C++11) 或 CryptGenRandomsrand/rand 非執行緒安全,多執行緒需加鎖或改用 thread_local 引擎