引言
在實際編程中,我們經常會用到隨機數這個概念,其實也是一個偽隨機數,實際上並不是一個真正的隨機數,但是也足夠我們使用了。在C語言中,編寫一些關於遊戲之類的程序時就需要用到隨機數了。同時C語言也提供了一個標準庫裡面一個函數來產生隨機數,而對於隨機數的產生是根據種子(根據一個數值按照某種公式計算的)來變化的,種子 與隨機數之間符合正態分布(高斯分布)。
生成隨機數
在C語言中,我們一般使用 <stdlib.h> 頭文件中的 rand() 函數來生成隨機數,它的用法為:
int rand (void);【void是指不需要傳遞參數】
rand() 會隨機生成一個位於 0 ~ RAND_MAX 之間的整數。而對RAND_MAX 是 <stdlib.h> 頭文件中的一個宏,它用來指明 rand() 所能返回的隨機數的最大值。C語言標準並沒有規定 RAND_MAX 的具體數值,只是規定它的值至少為 32767。
生成隨機數實例
#include <stdio.h>
#include <stdlib.h>
int main()
{
int rands;
rands = rand();
printf("生成的隨機數為:%d\n",rands);
return 0;
}
但是這個隨機數一旦編譯之後就固定了,並不能滿足我們的實際需求,前面提到了只是一個偽隨機數,我們需要對產生隨機數的種子進行不斷的重播,從而達到我們實際需求的隨機數效果。我們可以通過 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 rands;
srand((unsigned)time(NULL));
rands = rand();
printf("本次產生的隨機數為:%d\n", rands);
return 0;
}
小提示:根據種子與隨機數的符合高斯分布的關係可知,生成的隨機數是逐漸增大或者逐漸減小!
生成一定範圍隨機數
在實際編程開發中,實際需求往往是一定範圍內的隨機數,對於產生一定範圍的隨機數,就需要使用一定的技巧了,而筆者常用的方法是取模運算,再加上一個加法運算:
int a = rand() % 10; //產生0~9的隨機數,注意10會被整除
如果要規定上下限:
int a = rand() % 51 + 100; //產生100~150的隨機數
分析:取模即取餘,rand()%51+13,看成兩部分:rand()%51是產生 0~50 的隨機數,後面+100保證 a 最小只能是 100,最大就是 50+100=150。