采样百分比的网络流量

时间:2013-06-14 17:00:37

标签: math web-traffic

我有一个问题,我很确定我认为我知道答案,但我希望得到一些验证。最近有人问我他们如何随机抽取一定比例的网络流量。他们想要做的是通过提供不同的体验来区别对待5%的流量。我在基础层面提出的建议类似于下面的代码。

double rand = Math.random()*100;
if(rand < 5){
    //treat differently
}

因此,为了确保我没有做出一些荒谬的假设,我决定测试它,使用Thread.sleep()模拟请求的零星不均匀流入,通过执行以下操作

long runtime = 120000;
double requests = 0;
double hits = 0;
double rand = Math.random()*100;
long starttime = System.currentTimeMillis();

while(starttime + runtime > System.currentTimeMillis()){
    requests++;
    if(rand < 5){
        hits++;
    }
    rand = Math.random()*100;
    try{
        Thread.sleep((long)rand * 100);
    }catch(InterruptedException e){
    }
}

System.out.println(hits);
System.out.println(requests);
System.out.println(hits/requests);

没有Thread.sleep,无论运行时间如何,我都会得到类似于以下内容的结果

2902723.0
5.8084512E7
0.04997413079755237

但是使用Thread.sleep,命中率的百分比变化很大。我的假设是我所经历的是类似于数学限制的东西,其中没有Thread.sleep运行的原因是因为它实际上达到了“无限”的请求量。而且我还假设,如果我们长期生产,我们的命中率最终也会达到5%。我是不是基地,还是我认为有效?提前谢谢。

0 个答案:

没有答案