我想要一个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击中,这怎么可能?
答案 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