加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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时重试.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读