2016-05-23 145 views
26

我只是,想知道如果randhttp://www.cplusplus.com/reference/cstdlib/rand/)函數將生成隨機數的相同的序列,而使用相同的種子不同libc實現,甚至不同的編譯器和操作系統(贏,linux下運行)。對於相同的種子,由rand生成的隨機數序列在C中保證總是相同的?

我沒有使用各種編譯器的一些測試(G ++ 4.8,G ++ 5.1和鐺),它似乎,答案是肯定的,但是我沒有發現使用任何「官方」的PRNG算法的提在C的隨機數生成(http://pubs.opengroup.org/onlinepubs/009604599/functions/rand.html),還是這些都應該在標準中提到的...

+3

從你發佈的鏈接(posix):'如果srand()然後被調用相同的種子值,則應該重複僞隨機數的序列。 C11,§7.22.2.2具有相同的措詞。 –

+0

@ P.P。是的,對於我來說,使用不同的編譯器,序列在不同的計算機上是否也是相同的。 – fritzone

+1

我懷疑你已經比較了同一個生成器的三個實現,其中兩個(g ++的)是相同的。 – molbdnilo

回答

35

中有什麼會產生標準不能保證:

從標準:

那裏對所產生的隨機序列的質量沒有保證,並且已知某些實施方式產生令人不安的非隨機低位比特的序列。具有特定 要求的應用程序應該使用已知足以滿足其需求的發生器。

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

23

甚至沒有RAND_MAX被指定爲具有跨越比其他C實現的給定值必須> = 32767所以rand()在一個實現可以返回不同的範圍比在另一個值,並因此不同的序列。

rand函數計算僞隨機整數在 範圍爲0〜RAND_MAX的序列。 C11dr§7.22.2.12

RAND_MAX宏的值至少應爲32767 C11dr§7.22.2.15

RAND_MAX它將擴展爲一個整數常量表達式,它是由rand函數返回的最大值§7.223

即使是相同的RAND_MAX,注意@Servé Laurijssen回答:值從rand()順序可能會有所不同。


注:暗示,暗示,RAND_MAX <= INT_MAX

相關問題