在程式設計中,我們經常需要生成隨機數,例如,貪吃蛇遊戲中在隨機的位置出現食物,撲克牌遊戲中隨機發牌等。
在c語言中,我們一般使用 標頭檔案中的 rand() 函式來生成隨機數,它的用法為:
int rand (
void
);
void 表示不需要傳遞引數。
c語言中還有乙個 random() 函式可以獲取隨機數,但是 random() 不是標準函式,不能在 vc/vs 等編譯器通過,所以比較少用。
rand() 會隨機生成乙個位於 0 ~ rand_max 之間的整數。
rand_max 是 標頭檔案中的乙個巨集,它用來指明 rand() 所能返回的隨機數的最大值。
下面是乙個隨機數生成的例項:
#include
#include
intmain()
執行結果舉例:
193
多次執行上面的**,你會發現每次產生的隨機數都一樣,這是怎麼回事呢?為什麼隨機數並不隨機呢?
實際上,rand() 函式產生的隨機數是偽隨機數,是根據乙個數值按照某個公式推算出來的,這個數值我們稱之為「種子」。種子和隨機數之間的關係是一種正態分佈,如下圖所示:
種子在每次啟動計算機時是隨機的,但是一旦計算機啟動以後它就不再變化了;也就是說,每次啟動計算機以後,種子就是定值了,所以根據公式推算出來的結果(也就是生成的隨機數)就是固定的。
我們可以通過 srand() 函式來重新「播種」,這樣種子就會發生改變。srand() 的用法為:
void srand (
unsigned
int seed)
;
它需要乙個 unsigned int 型別的引數。我們可以用時間作為引數,只要每次播種的時間不同,那麼生成的種子就不同,最終的隨機數也就不同。
使用 標頭檔案中的 time() 函式即可得到當前的時間(精確到秒),就像下面這樣:
srand((
unsigned
)time
(null))
;
對上面的**進行修改,生成隨機數之前先進行播種:
#include
#include
#include
intmain()
多次執行程式,會發現每次生成的隨機數都不一樣了。但是,這些隨機數會有逐漸增大或者逐漸減小的趨勢,這是因為我們以時間為種子,時間是逐漸增大的,結合上面的正態分佈圖,很容易推斷出隨機數也會逐漸增大或者減小。
我們往往需要一定範圍內的隨機數,過大或者過小都不符合要求,那麼,如何產生一定範圍的隨機數呢?我們可以利用取模的方法:
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
#include
#include
intmain()
我們需要一組隨機數(多個隨機數),該怎麼生成呢?很容易想到的一種解決方案是使用迴圈,每次迴圈都重新播種,請看下面的**:
#include
#include
#include
intmain()
return0;
}
執行結果舉例:
888
8888888
執行結果非常奇怪,每次迴圈我們都重新播種了呀,為什麼生成的隨機數都一樣呢?
這是因為,for 迴圈執行速度非常快,在一秒之內就執行完成了,而 time() 函式得到的時間只能精確到秒,所以每次迴圈得到的時間都是一樣的,這樣一來,種子也就是一樣的,隨機數也就一樣了。
C語言生成隨機數
1 關於c語言中有rand 函式來產生隨機數,但是初始seed為1,這樣做有乙個問題,即會產生固定序列的數,比如單獨呼叫rand 時會產生 1804289383 846930886 1681692777 1714636915 1957747793 424238335 719885386 164976...
C語言偽隨機數的生成
在stdlib.h中,有兩個函式與偽隨機數的生成有關 srand和rand。c語言中,隨機數表有很多列,srand函式是根據其引數 unsigned型別 來獲得乙個種子 seed 根據種子來設定從哪一列開始取隨機數。rand無引數,返回乙個相應的隨機數。種子相同,則從同一列隨機數中選取,rand每次...
C 隨機數生成
using system using system.collections.generic using system.text namespace createrandomno return sb.tostring 生成大寫字母隨機數 public static string getabcpwd i...