У меня есть класс, который также включает в себя случайное число двигателя и его распределение:Как сделать членную функцию класса в C++ генерировать различное случайное число каждый раз, когда оно вызывается?
#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)
не выполняет свою работу.
Мне действительно нужно найти проблему и исправить выход. Буду признателен за любую помощь.
код, который вы показываете для конструктора, кажется, создает * локальные * переменные, которые скрывают члены класса (т.е. вы инициализируете * локальные переменные *, а не * члены *, используемые позже). Не делай этого. – crashmstr
В принципе, удалите «дистрибутив» и «движок» из своего конструктора, сохраняя имена переменных и помещая их в список инициализаторов. – KABoissonneault
@KABoissonneault Нет, это не скомпилируется. Материал должен быть в списке инициализаторов. –