引言
在C語言中,rand函式可以用來產生亂數,但并不是真正意義上的亂數,它是回傳介于 0 和 RAND_ MAX 之間的偽隨機整數,這個數字是由一個演算法生成的,該演算法每次呼叫它時都回傳一個顯然不相關的數字序列,該演算法是使用一個種子來生成序列,當計算機正常開機后,這個種子的值是固定的,因此產生的偽隨機整數也是固定的,除非你為了改變這個值破壞了系統,為了初始化的值不同,C語言提供了srand函式,
srand函式原型
void srand(unsigned seed);
rand函式代碼示例
呼叫rand函式,需要包含頭檔案 <stdlib.h>
這里先說一下rand函式的用法,在確定的范圍內生成平凡的偽亂數,如下表所示:
| v1 = rand() % 100 | v1 取值范圍 0~99 |
|---|---|
| v2 = rand() % 100 + 1 | v2 取值范圍 1~100 |
| v3 = rand() % 30 + 1985 | v3 取值范圍 1985~2014 |
代碼示例
int main() {
int i = 0;
for (int i = 0; i < 10; i++) {
printf("%d ", rand() % 10);
}
system("pause");
return 0;
}
多次運行不難發現,每次運行結果都相同,這里就不貼運行結果了,大家下去可自行嘗試
srand函式代碼示例
呼叫srand函式,需要包含頭檔案 <stdlib.h>
此處注意
使用系統時間來初始化,需要包含頭檔案<time.h>
代碼示例
int main() {
int i = 0;
srand((unsigned int) time(0));
for (int i = 0; i < 10; i++) {
printf("%d ", rand() % 10);
}
system("pause");
return;
}
根據上面兩個代碼的運行結果便可看出,不加srand函式的rand函式產生的亂數是偽亂數
rand & srand
rand函式每次呼叫前都會查詢是否呼叫過srand(seed),是否給seed設定了一個值,如果沒有,種子的值就默認為1,直接用 1 來初始化種子,那生成的亂數每次就會重復,為了防止生成的亂數重復,一般使用時間戳作為時間種子,采用系統時間來初始化,使用time函式來獲得系統時間,它的回傳值為從 00:00:00 GMT, January 1, 1970 到現在所持續的秒數,然后將time_t型資料轉化為(unsigned)型再傳給srand函式,
RAND_MAX
RAND_MAX 是 <stdlib.h> 頭檔案中的一個宏,它用來指明 rand() 所能回傳的亂數的最大值,C語言標準并沒有規定 RAND_MAX 的具體數值,只是規定它的值至少為 32767,在實際編程中,我們也不需要知道 RAND_MAX 的具體值,把它當做一個很大的數來對待即可,
注意事項

如果我們兩次呼叫srand函式設定亂數種子之間的時間間隔不超過1s,這會導致我們重置亂數種子,從而等價于使用了一個固定的亂數種子,那么這兩次呼叫最后生成的亂數就是相同的,
所以,一定不要將srand寫在生成亂數的回圈中~
參考資料網址:http://cplusplus.com/
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/282658.html
標籤:其他
上一篇:爆肝整理!堪稱全網最詳細的十大常用經典排序演算法總結!!!排序演算法,看這一篇就足夠了!!!從此再也不怕面試被問到排序演算法啦!!!!
下一篇:詳解C語言/C++指標:篇1
