Я создал среду моделирования, в которой участвуют несколько стохастических частей. Я рисую числа из нормальных, равномерных и логнормальных распределений. В большинстве случаев это работает нормально, однако, когда я решаю сделать 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;
}
@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());
Других решений пока нет …