【知識】C語言隨機數生成,C語言rand和srand用法詳解


 

在實際編程中,咱們常常須要生成隨機數。例如,貪吃蛇遊戲中在隨機的位置出現食物,撲克牌遊戲中隨機發牌。程序員

在C語言中,咱們通常使用 <stdlib.h> 頭文件中的 rand() 函數來生成隨機數,它的用法爲:編程

int rand (void);dom

void 表示不須要傳遞參數。編程語言

C語言中還有一個 random() 函數能夠獲取隨機數,可是 random() 不是標準函數,不能在 VC/VS 等編譯器經過,因此比較少用。函數

rand() 會隨機生成一個位於 0 ~ RAND_MAX 之間的整數。學習

RAND_MAX 是 <stdlib.h> 頭文件中的一個宏,它用來指明 rand() 所能返回的隨機數的最大值。C語言標準並無規定 RAND_MAX 的具體數值,只是規定它的值至少爲 32767。在實際編程中,咱們也不須要知道 RAND_MAX 的具體值,把它當作一個很大的數來對待便可。設計

下面是一個隨機數生成的實例:blog

#include <stdio.h>遊戲

#include <stdlib.h>開發

int main(){

    int a = rand();

    printf("%d\n",a);

    return 0;

}

運行結果:

193

隨機數的本質

屢次運行上面的代碼,你會發現每次產生的隨機數都同樣,這是怎麼回事呢?爲何隨機數並不隨機呢?

實際上,rand() 函數產生的隨機數是僞隨機數,是根據一個數值按照某個公式推算出來的,這個數值咱們稱之爲「種子」。種子和隨機數之間的關係是一種正態分佈。


 

種子在每次啓動計算機時是隨機的,可是一旦計算機啓動之後它就再也不變化了;也就是說,每次啓動計算機之後,種子就是定值了,因此根據公式推算出來的結果(也就是生成的隨機數)就是固定的。

從新播種

咱們能夠經過 srand() 函數來從新「播種」,這樣種子就會發生改變。srand() 的用法爲:

void srand (unsigned int seed);

它須要一個 unsigned int 類型的參數。在實際開發中,咱們能夠用時間做爲參數,只要每次播種的時間不一樣,那麼生成的種子就不一樣,最終的隨機數也就不一樣。

使用 <time.h> 頭文件中的 time() 函數便可獲得當前的時間(精確到秒),就像下面這樣:

srand((unsigned)time(NULL));

對上面的代碼進行修改,生成隨機數以前先進行播種:

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

int main() {

    int a;

    srand((unsigned)time(NULL));

    a = rand();

    printf("%d\n", a);

    return 0;

}

屢次運行程序,會發現每次生成的隨機數都不同了。可是,這些隨機數會有逐漸增大或者逐漸減少的趨勢,這是由於咱們以時間爲種子,時間是逐漸增大的,結合上面的正態分佈圖,很容易推斷出隨機數也會逐漸增大或者減少。

若是你也想成爲程序員,想要快速掌握編程,趕忙關注小編加入學習企鵝圈子吧!

裏面有資深專業軟件開發工程師,在線解答你的全部疑惑~編程語言入門「so easy」

資料包含:編程入門、遊戲編程、課程設計等。

免費學習書籍:


 

免費學習資料:


 

生成必定範圍內的隨機數

在實際開發中,咱們每每須要必定範圍內的隨機數,過大或者太小都不符合要求,那麼,如何產生必定範圍的隨機數呢?咱們能夠利用取模的方法:

int a = rand() % 10;    //產生0~9的隨機數,注意10會被整除

若是要規定上下限:

int a = rand() % 51 + 13;    //產生13~63的隨機數

分析:取模即取餘,rand()%51+13咱們能夠當作兩部分:rand()%51是產生 0~50 的隨機數,後面+13保證 a 最小隻能是 13,最大就是 50+13=63。

最後給出產生 13~63 範圍內隨機數的完整代碼:

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

int main(){

    int a;

    srand((unsigned)time(NULL));

    a = rand() % 51 + 13;

    printf("%d\n",a);

    return 0;

}

相關文章
相關標籤/搜索