生成 10 個 50-60 之間的隨機整數,判斷是否包含 55。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int a[10];
int i, found = 0;
// 1. 設置種子 (僅一次!)
srand((unsigned int)time(NULL));
// 2. 生成 10 個 [50, 60] 範圍隨機數
printf("生成的隨機數: ");
for (i = 0; i < 10; i++) {
// rand() % 11 生成 0-10,+50 得到 50-60
a[i] = 50 + rand() % 11;
printf("%d ", a[i]);
// 3. 同時檢查是否為 55
if (a[i] == 55) found = 1;
}
printf("\n");
// 4. 輸出結果
if (found) {
printf("找到 55!\n");
} else {
printf("未找到 55。\n");
}
// 5. 統計分析 (額外)
int count[11] = {0}; // 50-60 對應索引 0-10
for (i = 0; i < 10; i++) count[a[i] - 50]++;
printf("\n頻率統計:\n");
for (i = 0; i < 11; i++) {
if (count[i] > 0) {
printf("%d: %d 次\n", 50 + i, count[i]);
}
}
return 0;
}
// 生成 [min, max] 之間的隨機整數 (包含邊界)
int rand_range(int min, int max) {
return min + rand() % (max - min + 1);
}
// 通用宏
#define RAND_RANGE(min, max) ((min) + rand() % ((max) - (min) + 1))
srand(time(NULL))?rand() 產生確定性偽隨機序列time(NULL) 返回當前秒數,每次運行種子不同當 RAND_MAX 不是範圍大小的整數倍時,rand() % N 會導致分布不均。
// 改進版:拒絕採樣消除偏差
int rand_range_unbiased(int min, int max) {
int range = max - min + 1;
int buckets = RAND_MAX / range;
int limit = buckets * range;
int r;
do {
r = rand();
} while (r >= limit);
return min + r / buckets;
}
#include <math.h>
void chi_square_test(int *freq, int n, int range) {
double expected = (double)n / range;
double chi2 = 0;
for (int i = 0; i < range; i++) {
double diff = freq[i] - expected;
chi2 += diff * diff / expected;
}
printf("卡方統計量: %.3f (自由度 %d)\n", chi2, range - 1);
// 查表判斷是否拒絕"均勻分布"假設
}
C11 引入 <stdalign.h> 但隨機數仍舊用 rand/srand。真正現代化需 C++ <random> 或第三方庫。
| 錯誤代碼 | 問題 | 修正 |
|---|---|---|
rand() % 10 + 50 | 生成 50-59,漏掉 60 | rand() % 11 + 50 |
循環中 srand(time(NULL)) | 同一秒內種子相同,生成相同數列 | 程序啟動時調用一次 |
未包含 <stdlib.h> | 隱式聲明警告 | 添加頭文件 |
a[i] = rand() * 10 / RAND_MAX + 50 | 浮點運算慢且有精度問題 | 整數取模更快 |
rand()、random() (BSD)、arc4random() (BSD/macOS) 質量