Я пытаюсь добавить функциональность генератора случайных чисел в свой класс, и я хочу сделать это максимально эффективно и кратко. Я использую этот класс для численного моделирования, поэтому я использую mersenne_twister_engine, std::mt19937
. Единственный способ, которым я смог успешно реализовать это, - это определить генератор случайных чисел в каждой функции-члене, которая требует функциональности случайных чисел. Однако это решение кажется неоптимальным. Например, в файле. cpp определение функции будет следующим:
void SomeClass::RandomNumberFunction(){
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution<> DIS;
// Generate random number:
float n = DIS(gen);
~~ some code using n ~~
}
Скорость и использование памяти моей программой не имеют значения для моих целей, но я хотел бы знать, есть ли В c ++ есть способ более эффективно реализовать mersenne_twister_engine и дистрибутив. В частности, одной из реализаций, которая кажется выполнимой, является передача указателей на объекты std ::iform_real_distribution <> и std :: mt19937 для каждой функции-члена, которой требуется случайное число, и эти объекты могут быть определены в теле main (). Или лучше, объект std :: bind может быть определен и указатель на него передан соответствующим функциям.
Это не похоже на значительное улучшение, хотя в моей текущей реализации все же.
Что было бы идеально, было бы для std :: random_device, std :: mt19937 и std :: iform_real_distribution <> объекты, которые будут членами класса. Я пытался реализовать это как:
SomeClass.h файл:
class SomeClass(){
private:
std::random_device rd;
std::mt19937 generator(rd());
std::uniform_real_distribution<> distribution(0.0, 1.0);
public:
SomeClass();
~SomeClass();
void RandomNumberFunction();
}
SomeClass. cpp файл:
void SomeClass::RandomNumberFunction(){
float n = distribution(generator);
~~ some code using n ~~
}
Но это не работает Я вижу, что включение определения распределения в объявление функции является причиной ошибки, но я не вижу обходного пути.
Возможно ли то, что я пытаюсь сделать, и если это так, это даже необходимо? Стоит ли тратить мое время на то, чтобы сделать реализацию более аккуратной, или первоначальное решение достаточно на практике?