Экспоненциальный генератор чисел иногда дает «странные» результаты

0

Я создаю симуляцию в C++, и у меня есть экспоненциальный генератор, чтобы сделать время всплеска процессов.

Обычно он возвращает значения как таковые: 3.14707,1.04998. Но часто в 1/10 случаев такие числа оказываются: 2.64823e-307

Это код генератора (я использую srand ( time(NULL) ); в начале программы):

double exponential(float u)
{
   double x,mean;
   mean = 10;
   // generate a U(0,1) random variate
   x = rand();
   u = x / RAND_MAX;
   return (-mean * log(u));
}

И так я присваиваю значения. В while часть внутри - это мое стремление избавиться от таких ценностей, но это не сработало:

for (int i = 0; i < nPages; i++)
{
    index[i] = i;
arrival[i]= poisson(r);
burst[i]=exponential(u);
while (burst[i]<1 || burst[i]>150)
    {
        cout<<"P"<<i<<endl;
        burst[i]=(burst[i-1]+burst[i+1])/2;
    }
}
Теги:
random

3 ответа

3

Почему вы используете библиотеку C вместо библиотеки C++?

std::random_device rd;
std::default_random_engine gen(rd());
std::exponential_distribution<double> dist(lambda);

double x = dist(gen);
  • 0
    Что делать, если у него нет поддержки C ++ 11?
  • 0
    Я приведу результаты к этому, если я не могу сделать что-нибудь еще, спасибо
Показать ещё 1 комментарий
0

Используя exponential функцию, скопированную дословно, я не могу воспроизвести описанную вами ошибку. Проблемы с PRNG сгибанием либо 0, либо RAND_MAX должны RAND_MAX только один раз из RAND_MAX, а не в 10% случаев. Я подозреваю, что это просто глючный компилятор, или то, что вы поделили, - это не тот код, который создает описанную проблему.

0

Если размер пакета равен nPages, тогда

for (int i = 0; i < nPages; i++)
{
    //...
    burst[i]=(burst[i-1]+burst[i+1])/2;
}

выйдет за его пределы, так что вы, скорее всего, окажетесь в бессмыслице. Вам нужно подумать о том, что требуется по краям.

Что касается комментариев о rand go rand, считающихся вредными, стоит смотреть. В вашем случае регистрация журнала 0 не является разумной.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню