隨機函數rand()的使用方法——C語言


原理:

引用自百度百科:

所需包含的頭文件:

1 #include <stdlib.h>

rand()函數是按指定的順序來產生整數,因此每次執行上面的語句都打印相同的兩個值,所以說C語言的隨機並不是真正意義上的隨機,有時候也叫偽隨機數,使用 rand() 生成隨機數之前需要用隨機發生器的初始化函數 srand(unsigned seed)(也位於 stdlib.h 中) 進行偽隨機數序列初始化,seed 又叫隨機種子,通俗講就是,如果每次提供的 seed 是一樣的話,最后每一輪生成的幾個隨機值也都是一樣的,因此叫偽隨機數,所以需要每次提供不同的 seed 達到完全的隨機,我們通常用時間函數 time(NULL) 作為 seed ,因為時間值每秒都不同,這個函數需要包含以下頭文件:

#include <time.h>

案例分析:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <time.h>
 4 int main()
 5 {
 6     srand(1);
 7     int i;
 8     for (i = 0; i < 10; i++)
 9       printf("%d ", rand()%11); 
10 } 

以上是用偽隨機數的代碼,運行結果:

8 9 9 1 7 5 5 10 1 0

無論運行多少次,結果都依然是以上隨機數,不會改變,因為每次設置的種子 seed 都是 1。

如把 seed 換成 time(NULL),每次就不一樣了,如下:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <time.h>
 4 int main()
 5 {
 6     srand(time(NULL));
 7     int i;
 8     for (i = 0; i < 10; i++)
 9       printf("%d ", rand()%11); 
10 } 

 運行結果:

1 6 3 4 5 5 9 8 10 10 42 6 4 2 4 3 2 5 1 2 9

 

這里的 time(NULL) 的結果是一個類似於 1524655706 的數字,並且每秒都在遞增 1,也就達成了 srand() 的 seed 不斷變化的目的,不斷生成新的隨機數。但是我們自身在用rand()函數時,即使不調用srand()也沒事,因為系統好像會自動調用。

拓展:

注意一下函數 rand() 函數括號內不需要加參數,直接調用 rand() 的話會生成下面這樣的數:

17163 2663 24810 4875 26975 14119 22193 11233 26009 20105

所以我們想要生成指定范圍的隨機數的話就需要使用到求余運算符 %,這里有個規律:例如我們需要 0–10的隨機數時,就寫成 rand()%11,0–100就寫成 rand()%101,就是運算符后的數字需要比需求范圍極值大 1,這其實就是取余運算的原理。舉個例子:對10取余,余數就是在0~9的范圍。

參考:

https://blog.csdn.net/knigh_yun/article/details/80082944


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM