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() для создания двойника, который имеет приблизительно равномерно распределенные биты в его мантиссе, поэтому он равномерно распределен в диапазоне от 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().

Ответ 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));

    }

}