gpt4 book ai didi

c++ - 传递给函数的 Default_random_engine 提供可重复的结果

转载 作者:行者123 更新时间:2023-11-27 22:58:00 29 4
gpt4 key购买 nike

我有一个类Permutation继承自 std::vector<int> .我创建了一个构造函数,使对象充满了非重复数字。 <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应该绑定(bind)到一个分发对象,但是嘿,我没有——我只在 shuffle() 中使用引擎(至少目前是这样)。

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

最佳答案

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

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

您正在一遍又一遍地传递处于相同状态的同一引擎的拷贝。所以你当然会得到相同的结果。改为通过引用传递引擎

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

这样它的状态将通过调用 std::shuffle 来修改。

关于c++ - 传递给函数的 Default_random_engine 提供可重复的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30676992/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com