簡體   English   中英

stdlib 的 rand() 是否總是給出相同的序列?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM