C++:为什么这个方法每次都返回相同的随机数?

标签 c++ random

我有一个类,其中有一些数据存储在一个 vector 中,还有一个方法应该选择一个随机元素并返回它,但是当我运行它时,它每次都返回相同的元素。

这是一个基于我的代码的简化示例:

#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){

关于C++:为什么这个方法每次都返回相同的随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50236190/

相关文章:

c++ - 检查类是否有指针数据成员

algorithm - 从抛硬币创建随机数生成器

c - C 中的数组打乱?

java - 产生随机数字时,为什么比人们想象的更早开始重复,有没有更好的方法?

swift - 在没有重复变量的情况下生成随机计数的随机 Int 数组

python - 如何删除列表中的重复数字,然后替换为新的随机数

c++ - 使用 Qt5 截取完整桌面的屏幕截图

C++ 通过引用传递

C++ 未命名类型结构成员

C++ - 使用带函数的模板时出现错误 'undefined reference'