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

更新 發佈閱讀 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
電資鼠 - 您的學習好夥伴
21會員
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
債券投資,不只是高資產族群的遊戲 在傳統的投資觀念中,海外債券(Overseas Bonds)常被貼上「高資產族群專屬」的標籤。過去動輒 1 萬甚至 10 萬美元的最低申購門檻,讓許多想尋求穩定配息的小資族望而卻步。 然而,在股市波動劇烈的環境下,尋求穩定的美元現金流與被動收入成為許多投資人
Thumbnail
債券投資,不只是高資產族群的遊戲 在傳統的投資觀念中,海外債券(Overseas Bonds)常被貼上「高資產族群專屬」的標籤。過去動輒 1 萬甚至 10 萬美元的最低申購門檻,讓許多想尋求穩定配息的小資族望而卻步。 然而,在股市波動劇烈的環境下,尋求穩定的美元現金流與被動收入成為許多投資人
Thumbnail
透過川普的近期債券交易揭露,探討債券作為資產配置中「穩定磐石」的重要性。文章分析降息對債券的潛在影響,以及股神巴菲特的操作策略。並介紹玉山證券「小額債」平臺,如何讓小資族也能低門檻參與海外債券市場,實現「低門檻、低波動、固定收益」的務實投資方式。
Thumbnail
透過川普的近期債券交易揭露,探討債券作為資產配置中「穩定磐石」的重要性。文章分析降息對債券的潛在影響,以及股神巴菲特的操作策略。並介紹玉山證券「小額債」平臺,如何讓小資族也能低門檻參與海外債券市場,實現「低門檻、低波動、固定收益」的務實投資方式。
Thumbnail
解析「債券」如何成為資產配置中的穩定錨,提供低風險高回報的投資選項。 藉由玉山證券的低門檻債券服務,投資者可輕鬆入手,平衡風險並穩定財務。
Thumbnail
解析「債券」如何成為資產配置中的穩定錨,提供低風險高回報的投資選項。 藉由玉山證券的低門檻債券服務,投資者可輕鬆入手,平衡風險並穩定財務。
Thumbnail
相較於波動較大的股票,債券能提供固定現金流,而玉山證券推出的小額債,更以1000 美元的低門檻,讓學生與新手也能參與全球優質企業債投資。玉山E-Trader平台即時報價、條件式篩選與清楚的交易流程等特色,大幅降低投資難度,對於希望分散風險、建立穩定現金流的人來說,玉山小額債是一個值得嘗試的理財起點。
Thumbnail
相較於波動較大的股票,債券能提供固定現金流,而玉山證券推出的小額債,更以1000 美元的低門檻,讓學生與新手也能參與全球優質企業債投資。玉山E-Trader平台即時報價、條件式篩選與清楚的交易流程等特色,大幅降低投資難度,對於希望分散風險、建立穩定現金流的人來說,玉山小額債是一個值得嘗試的理財起點。
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—二元一次方程式
Thumbnail
中學數學基礎練習—二元一次方程式
Thumbnail
中學數學基礎練習—二元一次方程式
Thumbnail
中學數學基礎練習—二元一次方程式
Thumbnail
中學數學基礎練習—一元二次方程式
Thumbnail
中學數學基礎練習—一元二次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
高中數學主題練習—對數方程式
Thumbnail
高中數學主題練習—對數方程式
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News