我试图用对数分布生成随机数。Java:用对数分布生成随机数
其中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);
大多数时间,我得到我需要的结果,但是每隔一段时间就会得到一个值大于maxN
的值n
。
这是为什么?我看到它的方式,Math.random()
的最大值是1.0;
因此最大值(Math.random() * t))
是t
;因此,由于t = 2^maxN,所以log2(t)的最大值是maxN。
我的逻辑走向何处?
感谢
+1 @ abhin4v:感谢您的评论! – bguiz 2010-09-19 13:32:02
我有支票,然后你拿了它! – 2010-09-19 13:47:11
+ check @ abhin4v:你说得对log(t)/ log(2)> maxN 由于转换为int,错误是“隐藏的”,但这是一个更符合实际的正确方法。 – bguiz 2010-09-19 13:47:23