![](/img/trans.png)
[英]Deterministic random number generator tied to instance (thread independent)
[英]Random engine state and multiple deterministic independent random sequences
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...
};
如果不了解有關您的體系結構的一些細節,這不是一個簡單的問題。 所以這只是一個嘗試:
如何將引用傳遞給知道如何提供隨機數的接口。 如果需要,此接口可能只有一個函數可以返回一定數量的隨機數。 這樣,您可以從下游函數(方法)中隱藏實現細節,並且傳遞常量引用幾乎是免費的。 您甚至可以在最高級別決定這些隨機數的來源(文件,隨機數生成器,您的室溫等)。
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
...
}
這樣的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.