如何使C++中class的成员函数每次调用时生成不同的随机数?
How to make a member function of a class in C++ generate a different random number each time it is called?
我有一个 class,其中还包括一个随机数引擎及其分布:
#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)
似乎没有发挥作用。
我真的需要找到问题并更正输出。如果有任何帮助,我将不胜感激。
您在 class
中定义 dist
和 eng
变量
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())
在构造函数中,您正在创建一个隐藏 class 成员的局部变量 dist
,而 class 成员默认初始化。默认初始化的 uniform_real_distribution
生成 [0,1) 范围内的值,floor
将始终变为 0。
Sami 很接近,但你真的应该初始化这些成员:
C::C()
: dist(0.0, pow(10, 12))
, rng(std::chrono::system_clock::now().time_since_epoch().count())
{}
我有一个 class,其中还包括一个随机数引擎及其分布:
#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)
似乎没有发挥作用。
我真的需要找到问题并更正输出。如果有任何帮助,我将不胜感激。
您在 class
中定义dist
和 eng
变量
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())
在构造函数中,您正在创建一个隐藏 class 成员的局部变量 dist
,而 class 成员默认初始化。默认初始化的 uniform_real_distribution
生成 [0,1) 范围内的值,floor
将始终变为 0。
Sami 很接近,但你真的应该初始化这些成员:
C::C()
: dist(0.0, pow(10, 12))
, rng(std::chrono::system_clock::now().time_since_epoch().count())
{}