Мерсенна твистер семя как

Я хотел бы сохранить состояние генератора случайных чисел как переменную-член, чтобы у каждого объекта, сгенерированного из этого класса, был свой. Необходимо, чтобы каждый раз, когда создавался объект, семя также менялось.

Я сделал следующую вещь, а именно изменил начальное число через конструктор объекта. Я сделал посев со временем (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 ++.
Спасибо!

1

Решение

Учитывая ваше описание, вы можете инициализировать ГСЧ, а затем передать его в качестве ссылки на 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

1

Другие решения


По вопросам рекламы [email protected]