0

我有一个问题,我很确定我知道答案,但我希望得到一些验证。最近有人问我他们如何随机抽取一定比例的网络流量。他们想做的是通过呈现不同的体验来区别对待 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%。我偏离了基地,还是我的想法有效?提前致谢。

4

0 回答 0