1. 前言
在程式設計中,亂數有著各種用途,尤其在 C 語言中被廣泛使用。亂數是一個重要的概念,可應用於遊戲情節生成、隨機抽樣、資料洗牌等多種場景。本文將詳細解說在 C 語言中生成亂數的方法,並提供實際應用範例,幫助您更深入理解 C 語言的亂數生成並拓展其應用範圍。
2. 什麼是亂數
亂數與偽亂數的概念
亂數是指無法預測的數值,一般是在特定範圍內隨機生成。然而,電腦所生成的亂數實際上是所謂的「偽亂數」,它是根據特定規則產生,因此並非完全隨機。由於偽亂數是透過演算法生成的,如果使用相同的種子值(初始值),將會產生相同順序的亂數。
3. 在 C 語言中生成亂數的方法
C 語言的標準函式庫提供了生成亂數的函式。這裡將詳細介紹主要使用的 rand()
函式、RAND_MAX
常數,以及設定種子值的 srand()
函式。
rand() 函式的基礎
rand()
函式是 C 語言中用來生成亂數的基本函式。它會隨機回傳一個介於 0 到 RAND_MAX
之間的整數。RAND_MAX
是函式庫中定義的常數,會依系統或環境而不同,但通常為 32767。
#include <stdio.h>
#include <stdlib.h>
int main() {
int random_number = rand();
printf("Random number: %dn", random_number);
return 0;
}
上述程式碼中,使用 rand()
函式生成一個 0 到 32767 之間的隨機整數並輸出。
使用 srand() 函式設定種子值
由於 rand()
函式是依據種子值生成亂數,若不設定種子值,每次執行程式會得到相同的亂數序列。為避免此情況,可使用 srand()
設定種子值,常見做法是將當前時間作為種子。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand((unsigned int) time(NULL)); // 以當前時間初始化種子
int random_number = rand();
printf("Random number: %dn", random_number);
return 0;
}
在此範例中,time(NULL)
取得當前時間並作為種子值設定,確保每次執行程式時生成不同的亂數。
生成特定範圍內的亂數
若要在特定範圍內(例如 1 到 10)生成亂數,可如下操作:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand((unsigned int) time(NULL));
int min = 1;
int max = 10;
int random_number = min + rand() % (max - min + 1);
printf("Random number between %d and %d: %dn", min, max, random_number);
return 0;
}
此程式會生成 1 到 10 之間的隨機數值,透過 rand() % (max - min + 1)
來確保數值落在指定範圍。

4. 亂數生成的應用範例
以下介紹幾個使用亂數的實際應用。
骰子模擬
可透過生成 1 到 6 的隨機數來模擬擲骰子的結果。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand((unsigned int) time(NULL));
int dice_roll = 1 + rand() % 6;
printf("Dice roll: %dn", dice_roll);
return 0;
}
此程式會輸出一個介於 1 到 6 的隨機數字作為擲骰子的結果。
陣列洗牌
將陣列元素隨機排列,可透過隨機交換元素來實現洗牌。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void shuffle(int *array, int size) {
for (int i = 0; i < size; i++) {
int j = rand() % size;
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
int main() {
srand((unsigned int) time(NULL));
int array[] = {1, 2, 3, 4, 5, 6};
int size = sizeof(array) / sizeof(array[0]);
shuffle(array, size);
printf("Shuffled array: ");
for (int i = 0; i < size; i++) {
printf("%d ", array[i]);
}
printf("n");
return 0;
}
此程式會隨機交換陣列元素,達到洗牌的效果。
遊戲開發中的應用
在遊戲開發中,亂數可用於敵人出現位置、道具生成等,增加不可預測性,讓玩家體驗更真實。
5. 生成亂數時的注意事項
rand() 函式的限制
rand()
函式雖足以應付基礎亂數生成,但因為是偽亂數,會有固定週期。在大量生成亂數時,可能會出現週期性模式,若需完全隨機性,則不適用。
多執行緒環境的問題
在多執行緒環境下使用 rand()
,可能因為多個執行緒使用相同的種子值而生成相同的亂數。因此需確保每個執行緒使用不同的種子值。
使用高品質的亂數生成器
C++ 與其他語言提供了更高品質的亂數生成器。在 C 語言中雖選擇有限,但可使用 random()
函式或梅森旋轉演算法(mt19937
)等更進階的演算法。
6. 總結
本文介紹了在 C 語言中生成亂數的方法,並展示了實際程式碼範例與應用方式。雖然 rand()
在基礎應用上非常方便,但在需要完全隨機性的場合必須謹慎使用。