В чем разница между Math.random() * n
и Random.nextInt(n)
, где n
- целое число?
Math.random() против Random.nextInt(int)
Ответ 1
Вот подробное объяснение о том, почему "Random.nextInt(n)
является более эффективным и менее предвзятым, чем Math.random() * n
" на форуме Sun что Гили связан с:
Math.random() использует Random.nextDouble() внутренне.
Random.nextDouble() дважды использует Random.next() для создания двойника, который имеет приблизительно равномерно распределенные биты в его мантиссе, поэтому он равномерно распределен в диапазоне от 0 до 1- (2 ^ -53).
Random.nextInt(n) использует Random.next() меньше, чем дважды в среднем, он использует его один раз, и если полученное значение выше наивысшего кратного n ниже MAX_INT, он снова пытается, иначе возвращается значение по модулю n (это предотвращает превышение значений выше наивысшего кратного n ниже MAX_INT, искажая распределение), поэтому возвращает значение, которое равномерно распределено в диапазоне от 0 до n-1.
До масштабирования на 6 выход Math.random() является одним из 2 ^ 53 возможных значений, полученных из равномерного распределения.
Масштабирование на 6 не изменяет количество возможных значений, а литье в int затем заставляет эти значения в один из шести "ведер" (0, 1, 2, 3, 4, 5), каждое ведро, соответствующее диапазоны, охватывающие либо 1501199875790165, либо 1501199875790166 возможных значений (поскольку 6 не является разделителем 2 ^ 53). Это означает, что для достаточного количества рулонов кости (или матрицы с достаточно большим количеством боковых сторон) кубик будет показывать смещение в сторону более крупных ковшей.
Вы будете ждать очень долгое время, играя в кости, чтобы этот эффект появился.
Math.random() также требует примерно в два раза обработки и может быть синхронизирована.
Ответ 2
Еще один важный момент в том, что Random.nextInt(n) повторяется, поскольку вы можете создать два случайных объекта с семенем same. Это невозможно с помощью Math.random().
Ответ 3
Согласно https://forums.oracle.com/forums/thread.jspa?messageID=6594485� Random.nextInt(n)
является более эффективным и менее предвзятым, чем Math.random() * n
Ответ 4
В соответствии с этим примером Random.nextInt(n)
имеет менее прогнозируемый результат, то Math.random() * n. Согласно [отсортированный массив быстрее, чем несортированный массив] [1], я думаю, мы можем сказать, что Random.nextInt(n) трудно предсказать.
usingRandomClass: время: 328 milesecond.
usingMathsRandom: время: 187 миль.
package javaFuction;
import java.util.Random;
public class RandomFuction
{
static int array[] = new int[9999];
static long sum = 0;
public static void usingMathsRandom() {
for (int i = 0; i < 9999; i++) {
array[i] = (int) (Math.random() * 256);
}
for (int i = 0; i < 9999; i++) {
for (int j = 0; j < 9999; j++) {
if (array[j] >= 128) {
sum += array[j];
}
}
}
}
public static void usingRandomClass() {
Random random = new Random();
for (int i = 0; i < 9999; i++) {
array[i] = random.nextInt(256);
}
for (int i = 0; i < 9999; i++) {
for (int j = 0; j < 9999; j++) {
if (array[j] >= 128) {
sum += array[j];
}
}
}
}
public static void main(String[] args) {
long start = System.currentTimeMillis();
usingRandomClass();
long end = System.currentTimeMillis();
System.out.println("usingRandomClass " + (end - start));
start = System.currentTimeMillis();
usingMathsRandom();
end = System.currentTimeMillis();
System.out.println("usingMathsRandom " + (end - start));
}
}