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