C語言隨機數的生成

2021-10-03 06:52:04 字數 2328 閱讀 6367

在程式設計中,我們經常需要生成隨機數,例如,貪吃蛇遊戲中在隨機的位置出現食物,撲克牌遊戲中隨機發牌等。

在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...