我正在尝试生成具有对数分布的随机数。
其中 n=1 出现一半时间,n=2 出现四分之一时间,n=3 出现八分之一时间,以此类推。
int maxN = 5;
int t = 1 << (maxN); // 2^maxN
int n = maxN -
((int) (Math.log((Math.random() * t))
/ Math.log(2))); // maxN - log2(1..maxN)
System.out.println("n=" + n);
大多数时候,我得到了我需要的结果,但是每隔一段时间,我就会得到一个n
大于maxN
.
为什么会这样?在我看来,最大值Math.random()
是 1.0;
因此最大值(Math.random() * t))
为t
;
因此 log2(t) 的最大值是 maxN,因为 t = 2^maxN;
我的逻辑在哪里偏离了轨道?
谢谢