Java中的随机int函数行为
发布时间:2020-12-15 04:24:28 所属栏目:Java 来源:网络整理
导读:我有以下代码: public class Main {private static final Random rnd = new Random();private static int getRand(int n) { return (Math.abs(rnd.nextInt())%n);}public static void main(String[] args) { int count=0,n = 2 * (Integer.MAX_VALUE/3); fo
我有以下代码:
public class Main { private static final Random rnd = new Random(); private static int getRand(int n) { return (Math.abs(rnd.nextInt())%n); } public static void main(String[] args) { int count=0,n = 2 * (Integer.MAX_VALUE/3); for(int i=0; i<1000000; i++) { if(getRand(n) < n/2) { count++; } } System.out.print(count); } } 这总是给我一个接近666,666的数字.这意味着产生的数字的三分之二低于n的下半部分.并非当n = 2/3 * Integer.MAX_VALUE时获得此值. 4/7是另一个给我类似差异的分数(~5714285).但是,如果n = Integer.MAX_VALUE或者n = Integer.MAX_VALUE / 2,则得到均匀分布.这种行为与使用的分数有何不同.有人可以对此有所了解. PS:我从Joshua Bloch的书“Effective Java”中得到了这个问题. 解决方法
问题出在模数(%)运算符中,导致数字分布不均匀.
例如,假设MAX_INT为10,并且n = 7,mod运算符将分别将值8,9和10映射到1,2和3.这将导致数字1,2和3的概率是所有其他数字的两倍. 解决此问题的一种方法是检查rnd.nextInt()的输出,并在它大于N时重试. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |