title | layout | categories | tags | excerpt |
---|---|---|---|---|
C語言之隨機數函數(rand())的使用方法 |
post |
C語言 |
C語言隨機數 僞隨機數 rand() srand() |
C語言關於隨機數函數的用法和原理 |
在程序設計中,難免會使用到隨機值函數,其原理與語法大多類似,接下來以C語言爲例介紹其隨機值函數 rand()
用法。
原理
引用百度百科,首先,需要包含頭文件:
#include <stdlib.h>
rand()函數是按指定的順序來產生整數,因此每次執行上面的語句都打印相同的兩個值,所以說C語言的隨機並不是真正意義上的隨機,有時候也叫僞隨機數,使用 rand()
生成隨機數之前需要用隨機發生器的初始化函數 srand(unsigned seed)
(也位於 stdlib.h
中) 進行僞隨機數序列初始化,seed
又叫隨機種子,通俗講就是,如果每次提供的 seed
是一樣的話,最後每一輪生成的幾個隨機值也都是一樣的,因此叫僞隨機數,所以需要每次提供不同的 seed
達到完全的隨機,我們通常用時間函數 time(NULL)
作爲 seed
,因爲時間值每秒都不同,這個函數需要包含以下頭文件:
#include <time.h>
理論太泛,下面用例子分析理解。
舉例分析
先來理解以下僞隨機數,編譯以下代碼:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand(1);
int i;
for (i = 0; i < 10; i++)
printf("%d, ", rand()%11);
}
運行結果
8, 9, 9, 1, 7, 5, 5, 10, 1, 0,
然後無論運行多少次,結果都依然是以上隨機數,不會改變,因爲每次設置的種子 seed
都是 1
。
但是假如把 seed
換成 time(NULL)
,每次就不一樣了,如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand(time(NULL));
int i;
for (i = 0; i < 10; i++)
printf("%d, ", rand()%11);
}
結果是就變了,並且每次都不一樣:
6, 3, 4, 5, 5, 9, 8, 10, 10, 4,
6, 4, 2, 4, 3, 2, 5, 1, 2, 9,
這裏的
time(NULL)
的結果是一個類似於1524655706
的數字,並且每秒都在遞增 1,也就達成了 srand() 的 seed 不斷變化的目的,不斷生成新的隨機數。
拓展
這裏注意一下例子中函數 rand()
的用法,函數括號內不需要加參數,如果直接調用 rand()
的話會生成下面這樣的數:
17163, 2663, 24810, 4875, 26975, 14119, 22193, 11233, 26009, 20105,
所以我們想要生成指定範圍的隨機數的話就需要使用到求餘運算符 %
,這裏有個規律:例如我們需要 0--10的隨機數時,就寫成 rand()%11
,0--100就寫成 rand()%101
,就是運算符後的數字需要比需求範圍極值大 1,當然這也是取餘運算的原理。