c++ - 如何引用随机生成器?

标签 c++ c++11 visual-c++

我正在尝试生成一个范围内的随机数。我在多个线程中有多个对象将调用此函数,该函数位于单例类中,因此只有一个对象被调用。但我注意到我的随机数更接近范围的中间,因此,在前 200 次调用中彼此接近,然后它们开始慢慢分散到给定范围内。

  1. 每次重新实例化和重新播种是否有害? 函数调用?我读过this answer但没有完全 明白了。
  2. 我试图保留 std::uniform_real_distribution<double> dis作为类变量,但我不断收到 uniform_real_distribution 的错误不是 std:: 的成员这是为什么?
  3. 我试图保留 std::shared_ptr< std::uniform_real_distribution<double> > _uniform_distribution作为类变量,仍然有错误。
  4. 引用随机生成器的正确方法是什么?
  5. 这个问题的正确解决方案是什么?

double getRandom(Object* foo){  
 std::random_device rnd;
 std::mt19937 gen(rnd());
 std::uniform_real_distribution<double> dis(0, foo->limit);
 double random = dis(gen);
 return random;
}

最佳答案

您应该只为随机数生成器播种一次。除此之外,您的 getRandom 函数是正确的。至于如何在类上下文中使用所有这些,您可以按照以下方法进行操作:

#include <random>

class RNG
{
public:
    RNG::RNG() : gen(std::random_device()()) {} // Seeds the mt19937.

    double getRandom(Object* foo){  
        std::uniform_real_distribution<double> dis(0, foo->limit);
        double random = dis(gen);
        return random;
    }

private:
    std::mt19937 gen;
};

因此在程序开始时,您实例化了一个RNGmt19937 将被播种一次。然后,只要您需要随机数,就可以在同一个 RNG 上调用 getRandom

关于c++ - 如何引用随机生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29102856/

相关文章:

c++ - 如何处理 “signed/unsigned mismatch” 警告(C4018,无循环)?

c++ - VariantChangeType 和溢出

c++ - CreateFont() 创建的字体规范和大小不正确

c++ - 从 char 指针中减去 char 数组产生一个 int?

c++ - 生成文件 -std=c++11

C++ 指向运算符的指针

c++ - 我如何使用 lldb 和 VSCode 将调试器与 bitcoind 和 bitcoin-cli 一起使用?

c++ - 将 stdio.h 程序转换为 iostream

c++ - 为什么 vector 的多参数构造函数采用未标记为 "explicit"的构造参数?

c++ - 我怎样才能 std::getline() 一个字符串?