簡體   English   中英

在c ++ 11中使用一個隨機引擎進行多分布

[英]using one random engine for multi distributions in c++11

我在我的應用程序中使用c ++ 11 new <random>標頭,並且在不同方法的一個類中,我需要具有不同分布的不同隨機數。 我只是將一個隨機引擎std::default_random_engine作為類成員將它放在帶有std::random_device的類構造函數中,並將其用於我的方法中的不同發行版。 以這種方式使用隨機引擎是可以的,或者我應該為我使用的每個分發聲明不同的引擎。

沒關系。

不共享發電機的原因:

  • 線程化(標准RNG實現不是線程安全的)
  • 隨機序列的確定性:

    如果您希望能夠(用於測試/追蹤錯誤)來控制生成的確切序列,那么通過隔離所使用的RNG可能會減少麻煩,特別是當並非所有RNG消耗都是確定性的時候。

將一個偽隨機數生成器用於不同的隨機變量時應該小心,因為這樣做會使它們變得相關。

下面是一個示例:如果要在兩個維度(例如x和y)中模擬布朗運動,則需要在兩個維度上進行隨機性。 如果從一個生成器(noise())獲取隨機數並連續分配它們

while(simulating)
    x = x + noise()
    y = y + noise()

然后變量x和y變得相關,因為偽數生成器的算法只會生成它們有多好的陳述,如果你生成每一個生成的數字,而不是像本例中那樣每隔一個生成一個數。 這里,布朗粒子可能以比在負方向上更高的概率移動到正x和y方向,從而引入人工漂移。

使用不同發電機的另外兩個原因請看sehe的答案。

MosteM的答案不正確。 只要您希望分布中的繪制是獨立的,這樣做是正確的。 如果由於某種原因,您需要完全相同的隨機輸入到不同分布的繪制,那么您可能需要不同的RNG。 如果你想要兩個隨機變量之間的相關性,最好從一個使用數學原理的公共隨機變量開始構建它們:例如,如果A,B是獨立的法線(0,1),那么A和aA + sqrt(1-a * * 2)B是正常的(0,1),相關性為a。

編輯:我在C ++ 11隨機庫上找到了一個很好的資源 ,可能對你有用。

沒有理由不這樣做。 根據您使用的隨機發生器,周期非常大(在Mersenne-Twister的情況下為2 ^ 19937),因此在大多數情況下,您甚至不會在執行程序期間達到一個周期的結束。 即使沒有這樣說,使用相同的發生器到達所有分布的時間比使用3個發生器每個進行1/3的周期更糟糕。

在我的程序中,我為每個線程使用一個生成器,它工作正常。 我認為這是他們在C ++ 11中拆分生成器和發行版的主要原因,因為如果你不允許這樣做,那么將發生器和發行版分開是沒有好處的,如果需要一個發生器無論如何每個分配。

暫無
暫無

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

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