随机引擎状态和多个确定性独立随机序列

时间:2012-04-17 17:36:56

标签: c++ random c++11 tr1

C ++ TR1随机数生成方案在保持不同线程中随机引擎的独立状态或独立随机序列方面改进了旧的C运行时库。旧库有一个全局状态机,这通常很糟糕。

然而,当实现需要确定性随机序列的算法时,我发现必须将引擎传递给应该从这样的序列中绘制数字的任何方法都很烦人。从设计角度来看,初始化随机种子的代码不需要知道堆栈中哪些方法使用随机数。然而,那些内部方法无法初始化自己的随机引擎,因为:

  1. 他们缺乏创造独特可再生种子的知识
  2. 内存要求阻止为许多下游客户端保持单独的状态
  3. 为了澄清,下游方法不需要从与主方法相同的序列中绘制数字,但它们确实需要在不同的运行中独立且可重现。

    关于如何优雅地解决这个难题的任何想法?

    修改

    澄清情况的一些代码

    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...
    };
    

1 个答案:

答案 0 :(得分: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  
    ...
}  
像这样的事情。