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