from :
標準庫(被包含於中)提供兩個幫助生成偽隨機數的函式:
函式一:int rand(void);
從srand (seed)中指定的seed開始,返回乙個[seed, rand_max(0x7fff))間的隨機整數。
(rand_max是vc
中stdlib.h
中巨集定義的乙個字元常量:
#define rand_max 0x7fff
,其值最小為
32767,
最大為2147483647
,通常在產生隨機小數時可以使用
rand_max。)
函式二:void srand(unsigned seed);
引數seed是rand()的種子,用來初始化rand()的起始值。
可以認為rand()在每次被呼叫的時候,它會檢視:
1)如果使用者在此之前呼叫過
srand(seed)
,給seed
指定了乙個值,那麼它會自動呼叫
srand(seed)
一次來初始化它的起始值。
2)如果使用者在此之前沒有呼叫過
srand(seed)
,它會自動呼叫
srand(1)
一次。
根據上面的第一點我們可以得出:
1)如果希望rand()在每次程式執行時產生的值都不一樣,必須給srand(seed)中的seed乙個變值,這個變值必須在每次程式執行時都不一樣(比如到目前為止流逝的時間)。
2) 否則,如果給seed指定的是乙個定值,那麼每次程式執行時rand()產生的值都會一樣,雖然這個值會是[seed, rand_max(0x7fff))之間的乙個隨機取得的值。
3)如果在呼叫rand()之前沒有呼叫過srand(seed),效果將和呼叫了srand(1)再呼叫rand()一樣(1也是乙個定值)。
4)乙個種子對應一系列隨機數。
舉幾個例子,假設我們要取得0~6之間的隨機整數(不含6本身):
例一,不指定seed:
for(int i=0;i<10;i++)
編譯執行,發現的確產生隨機數了,但是,
每次執行程式產生的隨機數都是一樣的,為什麼呢?
因為隨機數取在
c語言中採用的是固定序列,所以每次執行所取的是同乙個數
。那麼如何寫乙個程式,讓它每次執行時產生的隨機數
都不一樣呢?
(2)srand()函式:
原型: void srand(unsigned seed)
功能: 產生隨機數的起始發生資料,和rand函式配合使用
標頭檔案: stdlib.h time.h
例:#include
#include
#include
int main(void)
這時執行程式,會發現每次產生的隨機數都不一樣。
這是因為這裡採用了時間作為種子,而時間在每時每刻都
不相同,
所以就產生了"隨機"的隨機數了
。所以,要想產生不同的隨機數,在使用rand之前需要先呼叫srand。
這樣做相當麻煩,
有沒乙個更簡單的函式呢?
(3)randomize()函式:
原型: int randomize(void)
功能: 通過time函式來得到乙個隨機數
標頭檔案: stdlib.h time.h
該函式就相當於srand((unsign)(time(null)) 不過應注意的是randomize()的功能要通過time來實現所以在
呼叫它時標頭檔案要包含time.h。
(4)產生乙個x到y的隨機數:
由於rand產生的隨機數從0到rand_max,而rand_max是乙個很大的數,
那麼如何產生從x~y的數呢
?只要這樣寫:
k=rand()%(y-x+1)+x;
這樣可以產生任何範圍內的隨機數。
srand 和rand 函式詳解
c語言 c 或 int rand void void srand unsigned seed 函式說明 rand函式產生的隨機數嚴格意義講不是真正的隨機數,它裡面採用了線性同餘法計算出隨機數,該方法有個最大週期m,也就是說該方法實在一定的範圍內生成一串數字,不過這個m一般來說比較大,所以正常使用時一...
c語言裡函式rand()和srand()的用法
rand void 用於產生乙個偽隨機unsigned int 整數。srand seed 用於給rand 函式設定種子。srand 和 rand 應該組和使用。一般來說,srand 是對 rand 進行設定。比如 srand uint getcurrenttime int x rand 100 是...
C中的rand函式和srand函式
先我們要對rand srand有個總體的看法 srand初始化隨機種子,rand產生隨機數,下面將詳細說明。1 rand 產生隨機數 表頭檔案 include 定義函式 int rand void 函式說明 因為rand的內部實現是用線性同餘法做的,他不是真的隨機數,只不過是因為其週期特別長,所以有...