【发布时间】:2015-08-16 05:43:09
【问题描述】:
我有一个类,其中还包括一个随机数引擎及其分布:
#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) 似乎没有做好它的工作。
我真的需要找到问题并纠正输出。我将不胜感激。
【问题讨论】:
-
您为构造函数显示的代码似乎正在创建隐藏类成员的 local 变量(即您初始化 local variables 而不是 成员稍后使用)。不要这样做。
-
基本上,从你的构造函数中删除“distribution”和“engine”,同时保留变量名并将它们放在初始化列表中
-
@KABoissonneault 不,这不会编译。这些东西必须在初始化列表中。
-
@SebastianRedl 哎呀,现在我忘了说如果你需要变量种子,你必须做一个赋值
标签: c++ class random constructor member-functions