У меня есть следующий фрагмент кода:Случайные ИНТ поведение функции в 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);
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: Я получил эту проблему из книги «Эффективная Ява» Джошуа Блоха.
Дайте [rand() считается вредным] (http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful), чтобы реализовать некоторые из проблем в коде. –