У вас есть два варианта:
- Сначала «подбросьте монету», чтобы решить, положительно или отрицательно, затем сгенерируйте -10 / -30 или 10/30 в зависимости от подбрасывания монеты.
- Сгенерируйте случайное число в диапазоне [0,40] и сопоставьте его с вашим фактическим желаемым диапазоном.
Обратите внимание, что # 1 проблематично c, если 2 диапазона не совпадают. t одинакового размера, если вы хотите равномерного случайного распределения.
В качестве отдельного примечания, Math.random() * 20
неверно.
По сути, в порядке математического доказательства:
- a
double
in java имеет 64 бита. Это означает, что он может представлять не более 2 ^ 64 чисел. Это МНОГО чисел, но не бесконечное их количество. - ... и только некоторые из этих чисел находятся между 0 (включительно) и 1 (исключая). Допустим, их 1000005.
- Учитывая, что это ровно 10000005 из них, и каждое последнее из этих 10000005 чисел будет «отображаться» на одно из ваших чисел, которые имеют общий «диапазон» 20 ( или 40, не имеет значения), ну, 40 не идеально подходит для 10000005.
- Таким образом, я доказал, что некоторые числа будут встречаться чаще, чем другие, и ваш результат не является действительно случайным. QED.
Решение состоит в том, чтобы создать экземпляр Random и использовать его метод .nextInt(20)
, который IS действительно равномерно распределен.
Метод подбрасывания монет
Random r = new Random(); // make one instance, once, in your app.
boolean goNegative = r.nextBoolean();
int nr = (goNegative ? -1 : +1) * (10 + r.nextInt(20));
// note, like in your example, 10 is possible,
//but 30 cannot be hit. Make it r.nextInt(21)
//instead if it needs to be.
Метод сопоставления
Random r = new Random(); // make one instance, once, in your app.
int nr = r.nextInt(40);
if (nr < 20) nr -= 29; // all numbers from -29 to -10, inclusive, covered.
else nr -= 10; // covers 10-29 inclusive.