将Default_random_engine传递给函数会得到可重复的结果

Default_random_engine passed into a function gives repeatable results

本文关键字:结果 函数 random Default engine      更新时间:2023-10-16

我有一个继承自std::vector<int>的类Permutation。我创建了一个构造函数,使对象充满不重复的数字。随机性是由<random>的东西保证的,所以声明是这样的:

/* Creates a random permutation of a given length
 * Input: n - length of permutation
 *        generator - engine that does the randomizing work */
Permutation(int n, default_random_engine generator);

函数本身看起来像这样(跳过无关的细节):

Permutation::Permutation(int n, default_random_engine generator):
vector<int>(n, 0)
{
    vector<int> someIntermediateStep(n, 0);
    iota(someIntermediateStep.begin(), someIntermediateStep.end(), 0); //0, 1, 2...
    shuffle(someIntermediateStep.begin(), someIntermediateStep.end(), 
            generator);
    // etc.
 }

在以下上下文中调用:

auto seed = std::chrono::system_clock::now().time_since_epoch().count();
static std::default_random_engine generator(seed);
for (int i = 0; i < n; i++) 
    Permutation test(length, generator);

代码完全可以编译,但是Permutation的所有实例都是相同的。如何强制定期生成随机数?我知道default_random_engine应该绑定到一个分布对象,但是,嘿,我没有任何-我只在shuffle()中使用引擎(至少目前)。

是否有任何解决方案或变通方法,仍然使用<random>的优点?

您的Permutation构造函数按值接收引擎。因此,在这个循环中:

for (int i = 0; i < n; i++) 
    Permutation test(length, generator);

您正在一次又一次地传递处于相同状态的相同引擎的副本。所以你当然会得到相同的结果。通过引用传递引擎,而不是

Permutation::Permutation(int n, default_random_engine& generator)

这样,它的状态将被std::shuffle的调用修改

这是一个幼稚的错误,正如我所想的那样——我以错误的方式混合了类似问题的各种解决方案。

正如本杰明指出的,我不能一遍又一遍地复制同一个引擎,因为它仍然是一样的。但这本身并不能解决问题,因为引擎被毫无意义地声明为static(谢谢,Zereges)。

为清晰起见,更正后的代码如下所示:

Permutation(int n, default_random_engine &generator);
// [...]
Permutation::Permutation(int n, default_random_engine generator):
vector<int>(n, 0)
{
    vector<int> someIntermediateStep(n, 0);
    iota(someIntermediateStep.begin(), someIntermediateStep.end(), 0); //0, 1, 2...
    shuffle(someIntermediateStep.begin(), someIntermediateStep.end(), 
        generator);
    // etc.
}
// [...]
// some function
auto seed = chrono::system_clock::now().time_since_epoch().count();
default_random_engine generator(seed);
for (int i = 0; i < n; i++) 
    Permutation test(length, generator);
相关文章: