c++ - C++中如何让类的成员函数每次调用时生成不同的随机数?

标签 c++ class random constructor member-functions

我有一个类,其中还包括一个随机数引擎及其分布:

#include <iostream>
#include <cmath>
#include <random>
#include <chrono>

class C
{ 
  public:
      typedef std::mt19937_64 engine;
      typedef std::uniform_real_distribution<double> distribution;
      .
      .
      .

  protected:
      engine rng;
      distribution dist;
      void func();
      .
      .
      .
};

由于构造函数只被调用一次,所以我把种子放在里面:

C::C()
{   .
    .
    .  
    unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
    distribution dist(0.0, pow(10,12));
    engine rng(seed);
}

下面的成员函数应该生成一个随机数,并且将在程序的单次运行中被调用很多次:

void C::func()
{    .
     .
     .
     double randNum = floor(dist(rng));
     std::cout << randNum << std::endl;      
     .
     .
     .
}

但是,每次它都会生成数字 0 作为随机数。 dist(rng) 似乎没有发挥作用。

我真的需要找到问题并更正输出。如果有任何帮助,我将不胜感激。

最佳答案

您定义您的 disteng类中的变量

protected:
  engine rng;
  distribution dist; // Here
  void func();

然后在构造函数中定义另一个同名

C::C()
{   .
    .
    .  
    unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
    distribution dist(0.0, pow(10,12)); // Here
    engine rng(seed);
}

我假设您希望后者是一个赋值,而不是一个新变量。然后你会得到你想要的数字。

C::C()
{   .
    .
    .  
    unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
    dist = distribution(0.0, pow(10,12)); // Here
    rng = engine(seed);
}

或者初始化

C() : dist(0.0, pow(10, 12)),
  rng(std::chrono::system_clock::now().time_since_epoch().count())

关于c++ - C++中如何让类的成员函数每次调用时生成不同的随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30595957/

相关文章:

c++ - 测试井字游戏中可能获胜的可能性

c++ - 当给定索引处的列尚未创建时,setSectionResizeMode() 崩溃

c++ - 如何创建可以接受不同参数的函数指针 vector ?

java - 如何创建一个类来替换现有的java类?

c# - 如何在 C# 程序中生成一组随机字符串,以便不轻易预测它们?

c - 任意长度的随机数生成器

c++ - 前向包装在模板类中不起作用

swift - 在不同场景中声明类变量

java - 如何使内部类不可实例化?

c++ - 随机生成对象的算法