2012-04-17 58 views
1

C++ TR1隨機數生成方案改進了舊的C運行時庫,以保持不同線程中獨立狀態的隨機引擎或獨立隨機序列。舊的圖書館有一個全球性的國家機器,這通常是不好的。但是,當實現一個需要確定性隨機序列的算法時,我發現它不得不將引擎傳遞給任何應該從這樣的序列中抽取數字的方法。從設計角度來看,初始化隨機種子的代碼不需要知道堆棧中的哪些方法正在使用隨機數。然而,這些內部方法無法初始化它們自己的隨機引擎,因爲:隨機引擎狀態和多個確定性獨立隨機序列

  1. 他們缺乏知識,創造了獨特的可重複的種子
  2. 內存要求防止保持獨立狀態爲衆多下游客戶

爲了澄清,下游方法不需要從與主方法相同的序列中提取數字,但它們需要在不同的運行中獨立並且可重現。

任何想法如何優雅地解決這個難題?

編輯

一些代碼,以澄清有關情況

typedef std::mt19937 RandEng; 

class PossibleRandomConsumer; 

class RandomProvider { 
public: 
    void foo() { 
     std::uniform_int<> uni; 
     uni(eng, 17); // using the random engine myself 
     std::for_each(children.begin(), children.end(), [](PossibleRandomConsumer& child) { 
      // may or may not need a random number. if it does, it has to be different than from other children, and from other providers 
      child.DoSomething(eng); 
     }); 
    } 
private: 
    RandEng eng; // unique seed per RandomProvider 
    std::array<PossibleRandomConsumer,10000> children; // lots of these... 
}; 
+0

實際上您是否需要多個不同的隨機數序列或者是否有一個全局RNG足夠? – thiton 2012-04-17 17:50:13

+1

每個'客戶'需要不同的順序。按順序將相同的引擎傳遞給每個客戶端執行這項工作(排序爲全局RNG),但必須通過它並不是優雅 – killogre 2012-04-17 17:59:40

+0

@ killogre:對此有什麼不感興趣?你正在向每個功能傳遞它需要的信息來完成它的工作。它需要一個RNG,所以你通過一個RNG。 – 2012-04-17 18:02:44

回答

0

不是一個簡單的問題,不知道你的架構一些細節。所以這只是一個嘗試:
如何將引用傳遞給知道如何提供隨機數的接口。這個接口可能只有一個函數,如果詢問,它會返回一定數量的隨機數。通過這種方式,您可以隱藏下游函數(方法)的實現細節,並且傳遞常量引用幾乎是免費的。你甚至可以在頂層決定那些隨機數來自哪裏(文件,隨機數發生器,室溫......)。

class RandomNumberProvider { 
    public: 
     typedef std::vector<int> RandomArray; 
     virtual RandomArray Generate(unsigned numNumbers) = 0; 
}; 

void Consumer(const RandomNumberProvider& rndProvider) { 
    RandomNumberProvider::RandomArray rndNumber; 
    rndNumber = rndProvider(10); // get a sequence of 10 random numbers 
    ... 
} 

這樣的事情。

+0

如果我必須通過下游接口,那麼我知道下游有人可能需要它。目前我正在通過隨機引擎,以防某些實施需要它。 – killogre 2012-04-17 18:30:01

+0

好吧,我只是想告訴你一個可能有用的抽象級別。所以如果你的實現不知道它是否需要一個隨機生成器,你可能想要實現一個可以被要求使用隨機數生成器的靜態實例。也許是可以提供這樣的東西的單類或全局實例。 – pag3faul7 2012-04-17 18:40:42

+0

謝謝,@ pag3faul7。我試圖避免靜態實例(與舊的C rand()相同)。單例不合適,但每個提供者一個實例(參見上面的編輯示例)可能是一個好主意 – killogre 2012-04-17 18:51:03