![](/img/trans.png)
[英]Why does the C++ stdlib rand() function give different values for the same seed across platforms?
[英]Does stdlib's rand() always give the same sequence?
我非常喜歡能夠重復生成相同的偽隨機數據集,尤其是通過調整實驗代碼。 通過觀察,我會說rand()
似乎每次都給出相同的數字序列*。
是否保證在同一台機器/不同機器/不同架構上重復執行?
*顯然是同一個種子。
是的,給定程序的相同環境。 根據 C 標准 §7.20.2.2/2,
srand
函數使用參數作為新的偽隨機數序列的種子,這些偽隨機數將由后續調用rand
來返回。 如果隨后使用相同的種子值調用srand
,則應重復偽隨機數序列。 如果在對srand
進行任何調用之前調用了rand
,則應生成與第一次調用srand
時相同的序列,種子值為 1。
當然,這假設它使用相同的實現細節(即相同的機器,相同的庫在相同的執行周期)。 C 標准不強制要求標准隨機數生成算法,因此,如果您使用不同的 C 標准庫運行程序,可能會得到不同的隨機數序列。
如果您需要具有給定種子的可移植且有保證的隨機數序列,請參閱跨平台一致的偽隨機數問題。
保證為傳遞給srand()
的相同種子提供相同的序列 - 但僅在程序的單次執行期間。 一般來說,如果一個實現在行為上有一個選擇,則沒有具體要求該選擇在后續執行中保持不變。
在每次程序啟動時選擇一個“主種子”,並使用它以每次程序啟動時不同的方式擾亂偽隨機數生成器,這將是符合要求的。
如果您希望獲得更多確定性,則應在程序中實現帶有特定參數的 PRNG。
不。
C標准說:
如果隨后使用相同的種子值調用 srand,則應重復偽隨機數序列。
但它沒有說明偽隨機數序列實際上是什么 - 所以它在不同的實現中有所不同。
唯一的保證是rand()
將為給定實現的給定種子提供相同的數字序列。 不能保證在不同的機器或不同的架構中序列是相同的——而且幾乎可以肯定不會。
如果您需要使用完全相同的一組偽隨機數進行實驗,您可以做的一件事是使用srand
生成一長串隨機數並將它們寫入文件/數據庫。 然后,編寫一個可移植的“隨機數生成器”函數,從該文件中按順序返回值。 這樣,無論平台、 srand
實現或種子值如何,您都可以放心使用相同的輸入數據。
當切換到不同的機器/運行時/無論你可能不走運。 drand48
系列函數還有另一種可能的選擇。 這些被標准化以在所有機器上使用相同的算法。
如果您在 UNIX/Linux 環境中,您可以在手冊頁中看到drand48()和srand48( ),如果不是,您可以查看 C 語言的在線手冊。 原型可以在/usr/include/stdlib.h中找到。 第一個使用模擬中經常使用的線性同余方法。
如果您向 srand48() 即 srand48(2) 提供相同的種子,然后將 dran48() 放入 for 循環中,那么每次的順序都是相同的。 IE
include stdio.h
include stdlib.h
double drand48();
int main(void){
int i;
double rn;
srand48(2);
for(i=0; i<10; i++){
randNum = drand48();
printf("%.6l\n", randNum);
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.