範圍內的隨機唯一數生成演算法

更新於 發佈於 閱讀時間約 3 分鐘

今天如果要你印出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;
}
  • 這段程式碼的核心目的是 生成一組 1 到 100 的不重複隨機數排列,確保每個數字只出現一次,並且隨機順序排列。
  • 建立一個大小為 100 (N=100) 的布林陣列 occupied[]
    • occupied[i] = 0 表示這個數字尚未被選中。
    • occupied[i] = 1 表示這個數字已被選中,不可以重複選取。

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--,則會少輸出一個數字。
留言
avatar-img
留言分享你的想法!
avatar-img
電資鼠 - 您的學習好夥伴
9會員
215內容數
在當今數位時代,電資領域人才需求爆發式成長,不論是前端網頁設計、嵌入式開發、人工智慧、物聯網還是軟硬體整合,這些技術都在改變世界。而掌握 C/C++、Python、數位邏輯、電路學與嵌入式開發等大學電資領域的課程,正是進入這個高薪、高需求產業的關鍵!
2025/03/09
雙向串列 (Double Linked List, DLL) 是一種鏈結資料結構,本章節將以完整註解,搭配關鍵操作地方的圖示輔助學習,讓你輕鬆搞懂複雜觀念,並透過C語言實作。
Thumbnail
2025/03/09
雙向串列 (Double Linked List, DLL) 是一種鏈結資料結構,本章節將以完整註解,搭配關鍵操作地方的圖示輔助學習,讓你輕鬆搞懂複雜觀念,並透過C語言實作。
Thumbnail
2025/03/08
環狀鏈結串列是一種特殊的鏈結串列,其最後一個節點的指標指向第一個節點,而非 NULL,形成一個循環結構。本章節將以豐富圖示,引導讀者了解環狀串列在各種地方執行插入和刪除節點的步驟,輕鬆學會資工科的專業知識-環狀串列。
Thumbnail
2025/03/08
環狀鏈結串列是一種特殊的鏈結串列,其最後一個節點的指標指向第一個節點,而非 NULL,形成一個循環結構。本章節將以豐富圖示,引導讀者了解環狀串列在各種地方執行插入和刪除節點的步驟,輕鬆學會資工科的專業知識-環狀串列。
Thumbnail
2025/03/07
本章節將探討右上三角稀疏矩陣。
Thumbnail
2025/03/07
本章節將探討右上三角稀疏矩陣。
Thumbnail
看更多
你可能也想看
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—二元一次方程式
Thumbnail
中學數學基礎練習—二元一次方程式
Thumbnail
中學數學基礎練習—二元一次方程式
Thumbnail
中學數學基礎練習—二元一次方程式
Thumbnail
中學數學基礎練習—一元二次方程式
Thumbnail
中學數學基礎練習—一元二次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News