Я создаю симуляцию в 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;
}
}
Почему вы используете библиотеку C вместо библиотеки C++?
std::random_device rd;
std::default_random_engine gen(rd());
std::exponential_distribution<double> dist(lambda);
double x = dist(gen);
Используя exponential
функцию, скопированную дословно, я не могу воспроизвести описанную вами ошибку. Проблемы с PRNG сгибанием либо 0, либо RAND_MAX
должны RAND_MAX
только один раз из RAND_MAX
, а не в 10% случаев. Я подозреваю, что это просто глючный компилятор, или то, что вы поделили, - это не тот код, который создает описанную проблему.
Если размер пакета равен nPages, тогда
for (int i = 0; i < nPages; i++)
{
//...
burst[i]=(burst[i-1]+burst[i+1])/2;
}
выйдет за его пределы, так что вы, скорее всего, окажетесь в бессмыслице. Вам нужно подумать о том, что требуется по краям.
Что касается комментариев о rand
go rand, считающихся вредными, стоит смотреть. В вашем случае регистрация журнала 0 не является разумной.