Я хотел бы сохранить состояние генератора случайных чисел как переменную-член, чтобы у каждого объекта, сгенерированного из этого класса, был свой. Необходимо, чтобы каждый раз, когда создавался объект, семя также менялось.
Я сделал следующую вещь, а именно изменил начальное число через конструктор объекта. Я сделал посев со временем (NULL), но это недостаточно точно, поскольку объекты создаются намного быстрее, чем за секунду, хаха.
#include <iostream>
#include <cmath>
#include<random>
#include<chrono>
#include <ctime>class Test{
public:
Test();
std::mt19937 rng;
double randomNumber(double min, double max);
};
Test::Test(){
rng.seed(time(NULL));
}
double Test::randomNumber(double min, double max){
std::uniform_real_distribution<double> uniformDistribution(min, max);
return uniformDistribution(rng);
}
int main(){
Test a;
Sleep(1000*1);
Test b;
for (int i = 0; i < 10; i++){
std::cout << "Random number a: " << a.randomNumber(0, 10) << "\tRandom number b: " << b.randomNumber(0, 10) << std::endl;
}
}
Я борюсь с методом, описанным в [Sending rand () для класса C ++ от bames53.
Включая этот кусок
std::mt19937 eng{ std::chrono::high_resolution_clock::now().time_since_epoch().count() };
в объявлениях класса выдает следующую ошибку:
Ошибка: нет экземпляра конструктора «std :: merseene_twister_engine<_Ty, _Wx, многие другие> типы аргументов (std :: chrono :: system_clock :: rep)
Сейчас я точно не знаю, откуда возникла ошибка и как решить мою проблему. Пожалуйста, имейте в виду, что я более или менее новичок в C ++.
Спасибо!
Учитывая ваше описание, вы можете инициализировать ГСЧ, а затем передать его в качестве ссылки на Test
учебный класс:
class Test{
public:
Test(std::mt19937& rng): m_rng(rng){
}
std::mt19937& m_rng;
double randomNumber(double min, double max){
std::uniform_real_distribution<double> uniformDistribution(min, max);
return uniformDistribution(m_rng);
}
};
std::mt19937 rng{std::chrono::high_resolution_clock::now().time_since_epoch().count()};
Test a(rng);
Поскольку этот конкретный ГСЧ имеет очень длительный период, вы можете создать его экземпляр один раз, а затем извлечь из него значения во всех ваших классах, которым требуется генерация случайных чисел.
Пример использования:
std::mt19937 rng{std::chrono::high_resolution_clock::now().time_since_epoch().count()};
Test a(rng);
Test b(rng);
for(int i=0; i<10; ++i){
std::cout<< "a: " << a.randomNumber(0.0,1.0) << "b: " << b.randomNumber(5.0,6.0) << std::endl;
}
Вот этот код в действии: http://ideone.com/Lzyp22