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

更新 發佈閱讀 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
電資鼠 - 您的學習好夥伴
23會員
242內容數
在當今數位時代,電資領域人才需求爆發式成長,不論是前端網頁設計、嵌入式開發、人工智慧、物聯網還是軟硬體整合,這些技術都在改變世界。而掌握 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
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—一元二次方程式
Thumbnail
中學數學基礎練習—一元二次方程式
Thumbnail
高中數學主題練習—對數方程式
Thumbnail
高中數學主題練習—對數方程式
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—二元一次方程式
Thumbnail
中學數學基礎練習—二元一次方程式
Thumbnail
中學數學基礎練習—二元一次方程式
Thumbnail
中學數學基礎練習—二元一次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News