C++ TR1隨機數生成方案改進了舊的C運行時庫,以保持不同線程中獨立狀態的隨機引擎或獨立隨機序列。舊的圖書館有一個全球性的國家機器,這通常是不好的。但是,當實現一個需要確定性隨機序列的算法時,我發現它不得不將引擎傳遞給任何應該從這樣的序列中抽取數字的方法。從設計角度來看,初始化隨機種子的代碼不需要知道堆棧中的哪些方法正在使用隨機數。然而,這些內部方法無法初始化它們自己的隨機引擎,因爲:隨機引擎狀態和多個確定性獨立隨機序列
- 他們缺乏知識,創造了獨特的可重複的種子
- 內存要求防止保持獨立狀態爲衆多下游客戶
爲了澄清,下游方法不需要從與主方法相同的序列中提取數字,但它們需要在不同的運行中獨立並且可重現。
任何想法如何優雅地解決這個難題?
編輯
一些代碼,以澄清有關情況
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...
};
實際上您是否需要多個不同的隨機數序列或者是否有一個全局RNG足夠? – thiton 2012-04-17 17:50:13
每個'客戶'需要不同的順序。按順序將相同的引擎傳遞給每個客戶端執行這項工作(排序爲全局RNG),但必須通過它並不是優雅 – killogre 2012-04-17 17:59:40
@ killogre:對此有什麼不感興趣?你正在向每個功能傳遞它需要的信息來完成它的工作。它需要一個RNG,所以你通過一個RNG。 – 2012-04-17 18:02:44