随机引擎状态和多个确定性独立随机序列
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
...
}
像这样的东西。
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么 Serial.println(<char[]>);返回随机字符?
- 字符串-C++后显示的随机字符
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 循环中的随机函数
- 在c++构造函数中使用随机字符串生成器
- 独立读取-修改-写入顺序
- 使用std::mt19937从字符串中返回一个随机单词
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 如何在C++中高效地构造随机骰子
- 在类中使用随机生成器时出现性能问题
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 带有多个独立参数的C++For循环
- 将字符随机转换为大写的函数
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 如何生成一个随机的 n 位数,其中 n 是任意的
- C++,为什么我不能使用两个默认随机引擎生成独立的随机整数样本
- 设置随机种子独立rmath库
- 有没有办法使用犰狳 C++ 库在 C++ 中设置独立的随机流
- 随机引擎状态和多个确定性独立随机序列