2016-04-03 30 views
-1

當生成隨機數時,人們首先調用srand(int seed)來生成種子,然後調用rand(void)爲什麼僞隨機函數直接將種子作爲參數?

我的問題是爲什麼不直接使用一個函數作爲rand(int seed)

C標準有一個報價,我不明白,說

實現應表現爲,如果沒有庫函數調用srand函數。

我不確定它是否與本聲明有關。

該標準還給出了一個例子實現,我不明白,使用靜態變量的原因:

static unsigned long int next = 1; 
int rand(void) // RAND_MAX assumed to be 32767 
{ 
    next = next * 1103515245 + 12345; 
    return (unsigned int)(next/65536) % 32768; 
} 
void srand(unsigned int seed) 
{ 
    next = seed; 
} 
+2

關於不調用'srand()'(和'rand()'本身)的庫的部分可能是爲了確保'rand()'生成的序列的可重複性。 – EOF

+0

使用他們描述的功能之前,需要閱讀手冊頁。或者,你可以閱讀一本描述它們打算如何使用的C書。一旦閱讀,itr將非常清楚爲什麼你的問題提案是 - 好 - 一個壞主意。 – Olaf

回答

3

你不應該叫srand每次你打電話rand。事實上,這是一個非常糟糕的想法,因爲每次都會有相同的種子給你相同的序列:你最終會產生一個恆定的值。

srand當你想開始產生一個新的隨機值序列時應該被調用。在典型的情況下,這是一次,在節目開始時。

從此,每撥打rand將返回序列中的下一個數字。這就是爲什麼這裏存在一個靜態變量:因此rand可以選擇它以前離開的位置並生成下一個數字。

相關問題