今天如果要你印出1-100之間的不重複隨機數排列,你該怎麼做?
我們直接來看程式碼:#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
#define N 100 // 定義陣列的大小為100
int main() {
int i, r, sum = 0;
bool occupied[N] = {0}; // 初始化一個大小為N的陣列,用來追蹤哪些位置已被佔據
time_t t;
unsigned int count = 0; // 用來計數的變數
// 初始化隨機數生成器
srand((unsigned)time(&t));
// 遍歷陣列並輸出當前occupied陣列的值
for (i = 0; i < N; i++) {
printf("%2d %d ", i, occupied[i]);
// 每10個輸出一行
if ((i + 1) % 10 == 0) {
printf("\n");
}
}
printf("\n");
// 開始隨機分配occupied陣列的元素
for (i = 0; i < N; i++) {
count++; // 增加計數器
r = rand() % N; // 隨機生成一個0到N-1的數字
// 如果當前的元素尚未被佔據
if (!occupied[r]) {
printf("%3d ", r + 1); // 打印隨機選中的數字,+1使其從1開始
occupied[r] = 1; // 將該位置標記為已佔據
// 每10個數字輸出一行
if ((i + 1) % 10 == 0) {
printf("\n");
}
} else {
i--; // 如果隨機生成的位置已經被佔據,重新嘗試
}
}
// 輸出count結果,顯示總共進行了多少次隨機選取(包括重試次數)
printf("\nTotal random selections: %d\n", count);
return 0;
}
N=100
) 的布林陣列 occupied[]
:if (!occupied[r]) { // 如果這個索引還沒有被選取
printf("%3d ", r + 1); // 輸出 (轉換為 1~100)
occupied[r] = 1; // 標記為已選取
r + 1
讓輸出變成 1~100
而不是 0~99
。occupied[r] = 1
確保這個數字不會被重複選取。} else {當
i--; // 這次選取無效,i 不增加
}
r
這個數字已經被選取過時:i--
讓 i
不增加,表示這次隨機選取無效,必須重新選取新的數字,這樣就確保了每個數字只會出現一次。i--
,則會少輸出一個數字。