2013-04-18 2 views
-2

У меня есть программа, которая запускает более 1000000 итераций для имитации загрузки сервера. Скорость поступления запросов - это переменная. Например, если скорость прибытия равна 2: это означает, что каждые 2 итерации должен быть 1 запрос, который будет генерировать «около» 500 000 запросов в конце моделирования и так далее. Я не могу этого сделать, просто добавив новый запрос на каждый n-й интервал в зависимости от скорости прибытия. Должен быть фактор удачи.Равномерно распределенная вероятность в C

#include<stdio.h> 
#include<time.h> 
#include <stdlib.h> 

//random number generator method 
int random_number(int min_num, int max_num){ 
    int result=0,low_num=0,hi_num=0; 

    if(min_num<max_num){ 
    low_num=min_num; 
    hi_num=max_num+1; // this is done to include max_num in output. 
    }else{ 
    low_num=max_num+1;// this is done to include max_num in output. 
    hi_num=min_num; 
    } 
    result = (rand()%(hi_num-low_num))+low_num; 
    return result; 
} 

int main(){ 
    srand(time(NULL)); 
    unsigned int arrivalRate = 2; 
    unsigned int noOfRequests = 0; 
    unsigned int timer; 
    for(timer = 0; timer < 1000000; timer++){ 
    //gives a random number between 0 and arrival rate 
    int x = random_number(0, arrivalRate); 
    //there is a new request 
    if(x <= 1){ 
     noOfRequests++; 
    }  
    } 
    printf("No of requests: %d", noOfRequests); 
} 

Так что, если я запускаю этот код arrivalRate 2, он генерирует около 600.000 запросов, которые должны быть только около 500 000 (+ -1000 терпима) запросов. Как я могу улучшить свой код для получения более разумных результатов, он создает слишком много, чем ожидалось.

ответ

0

Результат случайной функции равномерно распределен между 0 и 2. Это означает, что выход равен 0, 1 или 2 с вероятностью 33%. Вы тестируете <= 1, что означает, что у вас есть 67% вероятности принять запрос, который составляет около 666 тысяч долларов за миллион.

Чтобы решить проблему, нужно исключить нижнюю границу из интервала, изменить вычисление результата:

result = (rand()%(hi_num-low_num+1))+low_num; 

Или вы можете захотеть, чтобы исключить верхнюю границу вместо этого, в зависимости от того, что вам нужно , Ваше заявление «Это означает, что каждые 2 итерации должен быть один запрос, входящий» не согласуется со случайным выбором двух чисел из набора из 3.

0

Я думаю, проблема заключается в смещении значений, возвращаемых вашей функцией случайных чисел.

rand() возвращает число с плавающей запятой, но результат усечен до целого числа, которое будет смещать его к меньшим числам. Начиная с noOfRequests приращений, когда результат < = 1, возможно, поэтому noOfRequests заканчивается настолько большим, чем 500 000.

0

Например, если скорость прибытия равна 2: это означает, что каждый 2 итераций, должны быть 1 входящими запрос ...

Нет, это означает, что в среднем должен быть 1, поступающим на каждые 2 итераций. Есть большая разница. Это означает, что среднее число запросов, созданных на итерацию, равно 1/2, а не 2.

В действительности вы, вероятно, захотите использовать другое распределение, чем Униформа. Если вы создаете счет на каждом временном шаге, иногда у вас будет счет 0, а иногда это может быть намного больше. То, как вы написали свою программу, пока вам нужно дискретное (подсчетное) распределение, которое никогда не становится отрицательным и имеет среднее значение 1/2. Do не использовать что-то вроде обычного (ака-гауссовского) распределения - он будет давать дробные значения и будет отрицательным на вас.

В конечном итоге вы можете преобразовать его в модель моделирования дискретных событий. Не нужно каждый раз смотреть на галочку, если ничего не происходит, и просмотр времени, как непрерывный, а не тикающий, часто более реалистичен. Зайдите в this Winter Simulation Conference tutorial paper за десять страниц, чтобы узнать, как это сделать. В коде есть Java, но концепции могут и были реализованы на любом количестве языков.В основном вам нужна очередь приоритетов, чтобы отслеживать, что происходит в каком порядке, и небольшой цикл событий, как описано в документе, чтобы управлять вещами.

Смежные вопросы