![](/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.