c++ - C++:为什么这个方法每次都返回相同的随机数?
问题描述
我有一个类,它的一些数据存储在一个向量中,一个方法应该选择一个随机元素并返回它,但是当我运行它时,它每次都返回相同的元素。
这是基于我的代码的简化示例:
#include <iostream>
#include <random>
#include <vector>
class MyObj{
private:
std::vector<int> set_data;
public:
MyObj(int num_elements){
for (int i = 0; i < num_elements; ++i){
set_data.push_back(i); // just so that there is some data in there
}
};
int getRandomElement(std::mt19937 rng){
std::uniform_int_distribution<int> uni(0,set_data.size()-1);
int idx = uni(rng);
return set_data[idx];
};
};
int main()
{
std::random_device r;
std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
std::mt19937 rng = std::mt19937(seed);
MyObj temp(50);
for (int i = 0; i < 20; i++){
std::cout << "getting random element: " << temp.getRandomElement(rng) << std::endl;
}
}
输出是:
getting random element: 19
getting random element: 19
getting random element: 19
getting random element: 19
getting random element: 19
getting random element: 19
getting random element: 19
getting random element: 19
getting random element: 19
getting random element: 19
getting random element: 19
getting random element: 19
getting random element: 19
getting random element: 19
getting random element: 19
getting random element: 19
getting random element: 19
getting random element: 19
getting random element: 19
getting random element: 19
有什么明显的我做错了吗?
解决方案
int getRandomElement(std::mt19937 rng){
std::uniform_int_distribution<int> uni(0,set_data.size()-1);
int idx = uni(rng);
return set_data[idx];
};
这是按值传递,这意味着 RNG 的状态是从原始状态复制而来,而原始状态永远不会更新。将此方法更改为通过引用传递应该可以解决此问题。
int getRandomElement(std::mt19937 & rng){
推荐阅读
- firebase - 图片相似度 - Firebase ML Vision 还是有其他软件包?
- delphi - TRttiProperty.SetValue 与 TMemoryStream 属性一起使用时如何避免内存泄漏?
- node.js - 从 npm 安装 Electron-Js 时出现 npm 错误
- security - 访问 `proc` 文件系统以从系统应用程序中读取 `/proc/[pid]/some-file`
- javascript - 下拉弹出问题
- gnuplot - 如果第三轴的gnuplot条件
- android - Kotlin recyclerview 仅显示 cardview 一些可用的数据大小,但不显示 value 或 textview
- javascript - 将大型对象的更新从 spread 转换为 Object.assign()
- php - 使用 htmlspecialchars() 在 PHP 中回显干净的文本
- android - 使用 OneTimeWorkRequest 和 enqueueUniqueWork 方法时多次调用 createWork