Неверный аргумент для Mersenne Twister::seed (C++)

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

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

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

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

Запрошенный код для ГСЧ:

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;
}

person Siddler    schedule 01.07.2013    source источник
comment
Вы используете VS в старой версии (до 2012 года)? 0-ошибка при инициализации mt в режиме отладки кажется известной проблемой.   -  person lip    schedule 01.07.2013
comment
Можете ли вы поделиться частью кода, где вы создаете и используете стандартные дистрибутивы?   -  person lip    schedule 01.07.2013
comment
Я добавил часть кода @lip Я использую VS 2010 v10.0.30319.1 О каких известных проблемах вы говорите?   -  person Siddler    schedule 01.07.2013
comment
На тот случай, если известная (для некоторых) упомянутая проблема вам не пригодится. Можете ли вы запустить это через отладчик, чтобы получить обратную связь о том, где утверждение действительно не удалось? Код вокруг этого места может сообщить вам, что ожидалось (т. е. что было бы допустимо), тогда как переменные в этой точке сообщат вам, что на самом деле было передано, поэтому, объединив эти два, вы, возможно, увидите, что это неверно.   -  person MvG    schedule 01.07.2013
comment
@Siddler См. connect.microsoft.com/VisualStudio/feedback/details/776456 - default_random_engine - это вихрь Мерсенна, и вы задаете его rand() здесь. Возможно, в какой-то момент rand() возвращает ноль, отсюда и ошибка. Можете ли вы проверить, прерывается ли default_random_engine generator (0); таким же образом?   -  person lip    schedule 02.07.2013


Ответы (1)


@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());

person Siddler    schedule 02.07.2013