-2

我有一个运行超过 1000000 次迭代来模拟服务器负载的程序。请求的到达率是一个变量。例如,如果到达率是 2:这意味着在每 2 次迭代中,应该有 1 个请求传入,这将在模拟结束时生成“大约”500,000 个请求,依此类推。我不能仅仅通过根据到达率在每个第 n 个间隔引入一个新请求来做到这一点。一定有运气因素。

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

因此,如果我使用到达率 2 运行此代码,它会生成大约 600,000 个请求,而这应该只有大约 500,000 个(+-1000 是可以容忍的)请求。如何改进我的代码以产生更合理的结果,它产生的结果比预期的要多。

4

3 回答 3

0

我想问题在于随机数函数返回的值存在偏差。

rand() 返回一个浮点数,但结果被截断为整数,这将使其偏向较小的数字。由于当结果 <=1 时noOfRequests 会增加,这可能就是noOfRequests最终远大于 500,000 的原因。

于 2013-04-18T12:22:15.550 回答
0

随机函数的结果均匀分布在 0 和 2 之间。这意味着输出是012,每个概率为 33%。您正在测试<= 1,这意味着您有 67% 的概率接受请求,大约为每百万 666K。

要解决您的问题,您需要从区间中排除下限,将结果的计算更改为:

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

或者您可能想要排除上限,具体取决于您的需要。您的陈述“这意味着在每 2 次迭代中,应该有 1 个请求传入”与从 3 个数字中随机选择 2 个数字不一致。

于 2013-04-18T13:24:27.713 回答
0

例如,如果到达率是 2:这意味着在每 2 次迭代中,应该有 1 个请求传入......

不,这意味着平均每 2 次迭代应该有 1 个传入。有很大的不同。这意味着每次迭代生成的平均请求数是 1/2,而不是 2。

实际上,您可能希望使用与 Uniform 不同的分布。如果您在每个时间步生成计数,有时您的计数为 0,有时可能更多。到目前为止,您编写程序的方式需要一个离散(计数)分布,它永远不会变为负数并且平均值为 1/2。不要使用正态(又名高斯)分布之类的东西——它既会给出分数,也会对你不利。

从长远来看,您可能希望转换为离散事件仿真模型。如果什么都没有发生,则无需查看每个时间刻度,并且将时间视为连续而不是刻度通常更现实。查看此冬季模拟会议教程论文,了解如何执行此操作的十页介绍。那里的代码是 Java,但这些概念可以并且已经用任意数量的语言实现。基本上,您需要一个优先级队列来跟踪以什么顺序发生的事情,以及一个如本文所述的小事件循环来控制事情。

于 2013-04-18T14:56:54.727 回答