先上代码
public static long randomByAvg(int avg) {
double p = 1 - 1.0 / (avg + 1);
Double r = Math.log(1 - Math.random()) / Math.log(p);
if (r > Long.MAX_VALUE) {
return Long.MAX_VALUE;
}
return r.longValue();
}
定义平均数为:avg
定义概率:
定义随机小数:r,范围[0,1)
总结公式如下:;
思路:
如果起始值为0,现在有一定概率(p)会+1,+1后又有一定概率(p)会+1,循环下去直到不继续加。
那么期望平均值为:
推导过程:
反推得到:
这个E就是上面定义的avg
那么现在可以通过平均数得到继续+1的概率了。
我们知道随机数R取值的范围为:,R的出现概率
所以概率应该是小于等于(1-p)的,所以取值范围是(0,1-p]
由于上面定义的随机小数r的范围是[0,1),所以我们让
也就是说
最终得出