将Default_random_engine传递给函数会得到可重复的结果
Default_random_engine passed into a function gives repeatable results
我有一个继承自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);
相关文章:
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- C++Brute Force攻击函数不会返回结果
- 如何从递归函数中完全返回,该函数给出了每个函数结果的累积相加?
- C++ SSE 内部函数:将结果存储在变量中
- c++ lambda:柯里和函数:使用按值捕获与按引用捕获返回不同的结果
- C++ 随机数生成器:尝试将结果作为向量获取,但通过制作 void 函数来执行此操作而出现错误
- C++ 获取函数在常量引用中按值返回的结果
- C++ 犰狳库中的sort_index()函数给出了错误的结果
- 从返回 std::optional of std::vector 的函数中获取结果到调用方
- 类中静态函数C++意外结果
- 为什么函数 tellg() 没有返回好的结果?
- 模板函数意外的结果
- 使用具有默认参数的函数模板进行 decltype 会使结果混乱(一个有趣的问题或 gcc 的错误)
- lambda 函数未显示正确的结果
- 为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
- 我们如何并行运行算法的 n 个实例并以有效的方式计算结果函数的平均值?
- Fmod 函数清楚地输出一个预期的双精度值,但 if(fmod == 预期的双精度值)的计算结果不是 true
- 有没有办法将 for 循环结果返回到像三元运算符这样的函数中?
- 为什么这个涉及 std::enable_if 的模板元函数会产生不希望的结果?
- 使用类似的比较函数时,在 c++ 中为 std:sort 获得不同的结果