- C程式設計教程
- C - 首頁
- C語言基礎
- C - 概述
- C - 特性
- C - 歷史
- C - 環境設定
- C - 程式結構
- C - Hello World
- C - 編譯過程
- C - 註釋
- C - 符號
- C - 關鍵字
- C - 識別符號
- C - 使用者輸入
- C - 基本語法
- C - 資料型別
- C - 變數
- C - 整數提升
- C - 型別轉換
- C - 型別強制轉換
- C - 布林值
- C語言中的常量和字面量
- C - 常量
- C - 字面量
- C - 轉義序列
- C - 格式說明符
- C語言中的運算子
- C - 運算子
- C - 算術運算子
- C - 關係運算符
- C - 邏輯運算子
- C - 位運算子
- C - 賦值運算子
- C - 一元運算子
- C - 自增和自減運算子
- C - 三元運算子
- C - sizeof 運算子
- C - 運算子優先順序
- C - 其他運算子
- C語言中的決策
- C - 決策
- C - if 語句
- C - if...else 語句
- C - 巢狀 if 語句
- C - switch 語句
- C - 巢狀 switch 語句
- C語言中的迴圈
- C - 迴圈
- C - while 迴圈
- C - for 迴圈
- C - do...while 迴圈
- C - 巢狀迴圈
- C - 無限迴圈
- C - break 語句
- C - continue 語句
- C - goto 語句
- C語言中的函式
- C - 函式
- C - 主函式
- C - 按值傳遞函式呼叫
- C - 按引用傳遞函式呼叫
- C - 巢狀函式
- C - 可變引數函式
- C - 使用者自定義函式
- C - 回撥函式
- C - 返回語句
- C - 遞迴
- C語言中的作用域規則
- C - 作用域規則
- C - 靜態變數
- C - 全域性變數
- C語言中的陣列
- C - 陣列
- C - 陣列的特性
- C - 多維陣列
- C - 將陣列傳遞給函式
- C - 從函式返回陣列
- C - 可變長陣列
- C語言中的指標
- C - 指標
- C - 指標和陣列
- C - 指標的應用
- C - 指標運算
- C - 指標陣列
- C - 指標到指標
- C - 將指標傳遞給函式
- C - 從函式返回指標
- C - 函式指標
- C - 指向陣列的指標
- C - 指向結構體的指標
- C - 指標鏈
- C - 指標與陣列
- C - 字元指標和函式
- C - 空指標
- C - void 指標
- C - 懸空指標
- C - 解引用指標
- C - 近、遠和巨型指標
- C - 指標陣列的初始化
- C - 指標與多維陣列
- C語言中的字串
- C - 字串
- C - 字串陣列
- C - 特殊字元
- C語言中的結構體和聯合體
- C - 結構體
- C - 結構體和函式
- C - 結構體陣列
- C - 自引用結構體
- C - 查詢表
- C - 點(.)運算子
- C - 列舉(或列舉型別)
- C - 結構體填充和打包
- C - 巢狀結構體
- C - 匿名結構體和聯合體
- C - 聯合體
- C - 位域
- C - typedef
- C語言中的檔案處理
- C - 輸入和輸出
- C - 檔案I/O(檔案處理)
- C預處理器
- C - 預處理器
- C - 指令
- C - 預處理器運算子
- C - 宏
- C - 標頭檔案
- C語言中的記憶體管理
- C - 記憶體管理
- C - 記憶體地址
- C - 儲存類
- 其他主題
- C - 錯誤處理
- C - 可變引數
- C - 命令執行
- C - 數學函式
- C - static 關鍵字
- C - 隨機數生成
- C - 命令列引數
- C程式設計資源
- C - 問答
- C - 快速指南
- C - 速查表
- C - 有用資源
- C - 討論
C語言中的隨機數生成
C語言中的stdlib.h庫包含rand()函式,該函式隨機返回一個整數,介於“0”和常量RAND_MAX之間。
rand()函式生成偽隨機數。它們不是真正的隨機數。該函式基於線性同餘生成器 (LCG) 演算法。
int rand(void);
示例 1
以下程式碼三次呼叫rand()函式,每次都可能產生不同的整數:
#include <stdio.h>
#include<stdlib.h>
int main() {
printf("%ld\n", rand());
printf("%ld\n", rand());
printf("%ld\n", rand());
return 0;
}
輸出
執行程式碼並檢查其輸出:
41 18467 6334
rand()函式沒有內建的設定種子的機制。預設情況下,它可能會使用特定於系統的值(通常基於程式啟動的時間)。
注意:srand()函式用於透過向rand()函式提供種子來提高隨機性。
示例 2
以下程式返回0到100之間的隨機數。rand()函式返回的隨機整數用作分子,並計算其對100的模值,以得到小於100的隨機數。
#include <stdio.h>
#include<stdlib.h>
int main(){
for(int i = 1; i <= 5; i++) {
printf("random number %d: %d \n", i, rand() % 100);
}
return 0;
}
輸出
執行程式碼並檢查其輸出:
random number 1: 41 random number 2: 67 random number 3: 34 random number 4: 0 random number 5: 69
示例 3
您還可以獲得給定範圍內的隨機數。您需要找到rand()結果除以範圍跨度的模值,並將結果新增到範圍的下限。
#include <stdio.h>
#include<stdlib.h>
int main() {
int i, num;
int lower=50, upper=100;
for (i = 1; i <= 5; i++) {
num = (rand() % (upper - lower + 1)) + lower;
printf("random number %d: %d \n", i,num);
}
return 0;
}
輸出
執行程式碼並檢查其輸出:
random number 1: 91 random number 2: 55 random number 3: 60 random number 4: 81 random number 5: 94
srand() 函式
stdlib.h庫還包含srand()函式,該函式用於為rand()函式的隨機數生成器設定種子。
您將使用以下語法來使用srand()函式:
void srand (unsigned seed);
或
int srand (unsigned int seed);
seed引數是一個整數,用作偽隨機數生成器演算法的種子。
注意:如果未初始化srand(),則rand()函式中的種子值設定為srand(1)。
通常,srand()函式使用time(NULL)(表示自紀元以來的當前時間)返回的值作為引數,以提高C語言中rand()生成的偽隨機數的隨機性。
由於時間值一直在變化,這將具有不同的種子值,從而導致更多變化的隨機序列。因此,如果您多次生成隨機數,則每次都可能產生不同的隨機值。
示例 1
請檢視以下示例:
#include <stdio.h>
#include<stdlib.h>
#include <time.h>
int main() {
srand(time(NULL));
printf("Random number: %d \n", rand());
return 0;
}
輸出
每次都會顯示0到RAND_MAX之間的新的隨機整數。
Random number: 1436786055
示例 2
我們可以包含srand()來生成給定範圍內的隨機數。
#include <stdio.h>
#include<stdlib.h>
#include <time.h>
int main() {
int i, num;
time_t t;
int lower = 100, upper = 200;
srand((unsigned) time(&t));
for (i = 1; i <=5; i++) {
num = (rand() % (upper - lower + 1)) + lower;
printf("random number number %d: %d \n", i, num);
}
return 0;
}
輸出
執行程式碼並檢查其輸出:
random number number 1: 147 random number number 2: 171 random number number 3: 173 random number number 4: 112 random number number 5: 181
rand()函式提供的隨機數生成不是真正的隨機數。使用相同的種子,您將始終獲得相同的序列。它還具有有限的範圍,因為它在特定範圍內(0到RAND_MAX)生成隨機數。
為了提高隨機性,您需要使用具有高不可預測性的良好種子值,例如系統時間或高解析度計時器。您還可以使用第三方庫來獲得更寬範圍的隨機數。