Вопрос-ответ

Math.random() versus Random.nextInt(int)

Math.random() против Random.nextInt(int)

В чем разница между Math.random() * n и Random.nextInt(n) где n - целое число?

Переведено автоматически
Ответ 1

Вот подробное объяснение того, почему "Random.nextInt(n) является одновременно более эффективным и менее предвзятым, чем Math.random() * n" из сообщения на форумах Sun, на которое ссылается Джили:


Math.random() использует Random.nextDouble() внутри.


Random.nextDouble() дважды использует Random.next() для генерации double, который имеет приблизительно равномерно распределенные биты в своей мантиссе, поэтому он равномерно распределен в диапазоне от 0 до 1-(2 ^-53).


Random.nextInt(n) использует Random.next() в среднем менее двух раз - он использует его один раз, и если полученное значение выше наибольшего кратного n ниже MAX_INT, он пытается снова, в противном случае is возвращает значение по модулю 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) является повторяемым, поскольку вы можете создать два случайных объекта с одинаковым начальным значением. Это невозможно с Math.random().

Ответ 3

Согласно https://forums.oracle.com/forums/thread.jspa?messageID=6594485&#6594485 Random.nextInt(n) является более эффективным и менее предвзятым, чем Math.random() * n

Ответ 4

Согласно этому примеру Random.nextInt(n) имеет менее предсказуемый результат, чем Math.random() * n. Согласно [сортируемый массив быстрее, чем несортированный массив] [1] Я думаю, мы можем сказать, что Random.nextInt (n) трудно предсказать.

Использование Randomclass : время:328 миллисекунд.

Использование mathsrandom : время: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));

}

}
java