У меня есть класс (randomHandler), который содержит несколько функций для вызова определенных типов случайных чисел (например, randomNormal (mu, sigma), randomUniform (), randomOnSphere () и т. Д. c) на основе генератора твистера Мерсенна.
Второй класс (aSubroutine) создает объект randomHandler и затем использует его как источник случайных чисел во всей подпрограмме. Мне нужна подпрограмма для итеративного вызова функций, которые передаются случайному объекту, но каждый предпринятый вызов в настоящее время возвращает повторяющиеся случайные числа.
Я предполагаю, что это связано с непониманием с моей стороны того, как движется случайный генератор к следующему случайному числу в «списке» и о том, как функция, выходящая за пределы области видимости, сбрасывает «индекс» случайного числа на то, что было до того, как оно было передано функции.
Что такое правильный способ обработки передачи объекта случайных генерирующих функций функции?
Некоторый код для справки. Приносим извинения за запутанный характер слоев, но я стремлюсь сделать его представительным без контекста.
#include ...
int main()
{
randomHandler randobj = randomHandler();
iterSubroutine itersub = iterSubroutine();
return 0;
}
//------randomHandler.h-----
class randomHandler
{
private:
mtHandler generator = mtHandler();
public:
void randomHandler();
void randomHandler(time);
~randomHandler();
double randomUniform();
double randomNormal(double mu, double sigma);
double randomOnSphere();
}
//------randomHandler.cpp-----
void randomHandler::randomHandler()
{
std::cout << generator.mtSeed << std::endl;
}
double randomHandler::randomUniform()
{
// I acknowledge there are better ways to handle random
// generation than the following.
std::uniform_real_distribution<double> disly(0.0, 1.0);
return disly(jb_generator.m_mt);
}
//other functions below
...
//------mtHandler.h-----
class mtHandler
{
public:
mtHandler();
~mtHandler();
std::mt19937 m_mt;
unsigned int m_mtseed;
};
//------mtHandler.cpp-----
mtHandler::mtHandler() : m_mt((std::random_device())())
{
m_mtseed = (std::random_device())();
m_mt.seed(m_mtseed);
}
mtHandler::~mtHandler()
{
}
//------iterSubroutine.h-----
class iterSubroutine
{
public:
void iterSubroutine();
void iterSubroutine(randomHandler randobj);
void function(randomHandler randobj);
~iterSubroutine();
}
//------iterSubroutine.cpp-----
iterSubroutine::iterSubroutine(randomHandler randobj)
{
// This loop repeats the same number
for (int i=0;i<10;i++)
{
function(randobj);
}
// This loop generates different numbers
for (int i=0;i<10;i++)
{
std::cout << randobj.randomUniform() << std::endl;
}
}
void iterSubroutine::function(randobj)
{
std::cout << randobj.randomUniform() << std::endl;
}
~iterSubroutine()
{
}