随机数发生器表现奇怪

时间:2013-03-10 04:38:36

标签: java random

我想要一个0到3之间的随机数,并尝试以下代码,看看它是如何工作的。

int[] count = new int[4];

    for (int i = 0; i < 1000; i++) {
        int t = (int)(Math.round((Math.random() *3)));

        count[t] +=1;

    }


    for (int i = 0; i < count.length; i++) {
        System.out.println(count[i]);

    }

现在奇怪的是,0和3击中了大约一半的时间1和2击中,这怎么可能?

4 个答案:

答案 0 :(得分:6)

查看每个整数的舍入间隔:

|----+----|----+----|----+----|
0         1         2         3

<...>
Rounds to 0
     <........>
     Rounds to 1
               <........>
               Rounds to 2
                         <....>
                         Rounds to 3

你可以看到圆形到0和3的范围是其他范围的一半,所以如果你统一选择,你可以经常选择它们的一半。

答案 1 :(得分:2)

http://docs.oracle.com/javase/6/docs/api/java/lang/Math.html#round(double)

  

返回与参数最接近的long。结果通过添加1/2舍入为整数,取结果的最低值,并将结果转换为long类型。

您正在创建不等大小的存储桶:

0 - 0.4999 ... =&gt; 0(.5)

0.5 - 1.499 ... =&gt; 1(1)

1.5 - 2.499 ... =&gt; 2(1)

2.5 - 2.99999 ... =&gt; 3(.5)

要修复,请使用:

Random.nextInt(4);

呃......错字,谢谢@TedHopp - 我的意思是:

Random r = new Random();
...
r.nextInt(4);

或者做

(int) (Math.random() * 4);s

哪个会做你期望的。

答案 2 :(得分:1)

这是因为你正在四舍五入。如果0小于0.5,则只能舍入为0。但是如果它在0.5和1.5之间,则可以选择1。因此给它两倍的发生几率。同样的事情发生在2,介于1.5和2.5之间。 3只是从2.5到3。

答案 3 :(得分:1)

class Math {
    ...
    public static long round(double a) {
       return (long)floor(a + 0.5d);
    }
    ...
}

命中1和2的可能性更大

int t = (int)(Math.ceil((Math.random() * 4))) - 1;

使用ceil代替圆形可以更好地分配:

250
239
242
269