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