在實際編程中,咱們常常須要生成隨機數。例如,貪吃蛇遊戲中在隨機的位置出現食物,撲克牌遊戲中隨機發牌。程序員
在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;
}