指数的实际运用

有一个需求,根据RPC耗时分段情况得到一个倍数系数,比如1到10ms的倍数是5,10ms到100ms的倍数3,100ms到1000ms的倍数是2.如果通过坐标图表示应该是一个沿x轴衰减的曲线,我首先想到通过对数来实现,我的一次实现方案:

for (int i = 1; i < 2000; ++i) {

double rate = (double) ((float) 3 / Math.log10(i < 2 ? 2 : i)) + 0.1;

if (rate < 1)

rate = 1;

float rate0 = Math.round(rate * 10) / 10.0f;

System.out.println(i + "\t" + rate0 + " \t " + Math.round(i * rate0));

}

由于log(10)10, log(10)100,log(10)1000的区间范围刚好是1--2---3。所以我的想法是用3除以对数,这样的结果:

i		rate	 result
3		6.4 	 19
5		4.4 	 22
10		3.1 	 31
50		1.9 	 95
100		1.6 	 160
200		1.4 	 280
300		1.3 	 390
400		1.3 	 520
500		1.2 	 600
800		1.1 	 880

可以看到衰减得太快了。我这样思考这个问题,如果要让衰减变慢可以用减法:

数据范围:1------10------100------100------1000

rate范围:6.0----5.0----4.0-------3.0------2.0

第二次实现方案:

for (int i = 1; i < 2000; ++i) {

double rate = 6 - Math.log10(i);

float rate0 = Math.round(rate * 10) / 10.0f;

System.out.println(i + "\t" + rate0 + " \t " + Math.round(i * rate0));

}

i		rate	 result
1		6.0 	 6
5		5.3 	 27
10		5.0 	 50
20		4.7 	 94
30		4.5 	 135
100		4.0 	 400
200		3.7 	 740
400		3.4 	 1360
500		3.3 	 1650
600		3.2 	 1920
800		3.1 	 2480
1000	3.0 	 3000
1900	2.7 	 5130

猜你喜欢

转载自san-yun.iteye.com/blog/2000393