簡體   English   中英

生成兩個獨立的隨機數序列(C ++)

[英]Generating two independent random number sequences (C++)

我希望能夠做這樣的事情(顯然不是有效的C ++):

rng1 = srand(x)
rng2 = srand(y)

//rng1 and rng2 give me two separate sequences of random numbers
//based on the srand seed
rng1.rand()
rng2.rand()

有沒有辦法在C ++中做這樣的事情? 例如在Java中,我可以使用我想要的種子創建兩個java.util.Random對象。 似乎C ++中只有一個全局隨機數生成器。 我確信有些庫提供了這種功能,但無論如何只用C ++來實現它?

使用rand_r

在TR1(和C ++ 0x)中,您可以使用tr1/random標頭。 它應該內置於現代C ++編譯器(至少對於g ++MSVC )。

#include <tr1/random>
// use #include <random> on MSVC
#include <iostream>

int main() {

    std::tr1::mt19937 m1 (1234);  // <-- seed x
    std::tr1::mt19937 m2 (5678);  // <-- seed y

    std::tr1::uniform_int<int> distr(0, 100);

    for (int i = 0; i < 20; ++ i) {
        std::cout << distr(m1) << "," << distr(m2) << std::endl;
    }

    return 0;
}

你也可以使用Boost.Random

這里有更多技術文檔

我只是想指出,使用不同的種子可能不會給你統計獨立的隨機序列。 mt19937是個例外。 用不同的種子初始化的兩個mt19937對象將給你或多或少(取決於你所要求的)具有非常高概率的統計獨立序列(序列重疊的可能性很小)。 Java的標准RNG非常糟糕。 有很多用於Java的mt19937實現,它應該比庫存RNG更受歡迎。

無論出於何種原因,以下發生器互相干擾。 我需要兩個獨立的生成器來完成任務,需要重建流。 我沒有挖掘代碼,但std :: tr1和C ++ 11生成器似乎共享狀態。 添加m2會改變m1將提供的內容。

std::tr1::mt19937 m1 (1234);  // <-- seed x
std::tr1::mt19937 m2 (5678);  // <-- seed y

我必須建立自己的以確保獨立性。

正如@James McNellis所說,我無法想象你為什么會這樣做,以及你會得到什么樣的專業人士。 描述您想要達到的效果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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