random — неверный аргумент для mersenne twister :: seed (C ++)

Я создал среду моделирования, в которой участвуют несколько стохастических частей. Я рисую числа из нормальных, равномерных и логнормальных распределений. В большинстве случаев это работает нормально, однако, когда я решаю сделать 100 симуляций друг за другом, я получаю ошибку:
R6010 Abort () был вызван.
В моей консоли я получаю ошибку: неверный аргумент для mersenne_twister :: seed. Однако я использую только стандартный генератор псевдослучайных чисел rand (). Ни в коем случае я не называю mersene_twister. Так что это, вероятно, метод из std :: normal_distribution.

Кроме того, я не определяю, почему мое начальное значение недопустимо после X итераций, а не для первых X итераций?

У кого-нибудь есть опыт работы с этой ошибкой? У кого-нибудь есть предложения как это решить

Постскриптум srand (время (0)) вызывается только один раз, в начале основного. При этом все случайные числа генерируются во втором классе «random_num».
P.s.s Я знаю, что это может быть не лучшим способом генерирования случайных чисел, однако этого достаточно для моей цели.

Код, запрошенный для RNG:

double random_num::uniform(int lb, int ub)//Generate uniformly distributed random numbers with lowerbound lb and upperbound ub
{
//srand(time(0));
double number;
number =((double) rand() / (RAND_MAX+1)) * (ub-lb+1) + lb;

return number;
}

double random_num::normal(double mean,  double var) //Generate normally distributed random numbers with mean and variance
{

//srand(time(0));
default_random_engine generator (rand());

normal_distribution<double> distribution(mean, var);

return distribution(generator);
}

double random_num::lognormal(double mean, double var, double offset)
{
//srand(time(0));
random_num dummy;
double random;random = exp(dummy.normal(mean,var))-offset; //Calculate the 3 parameter lognormal

return random;
}

2

Решение

@lip Проблема была в том, что rand () в какой-то момент вернул ноль. И поэтому default_random_engine generator(0); прервана.

Решение было довольно простым:
Создайте функцию, которая проверяет, что rand () не ноль:

int rand0()
{
int dummy = rand();
while(dummy==0)
{
dummy = rand();
}
return dummy;
}

А потом: default_random_engine generator(rand0());

2

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

Других решений пока нет …

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