Math.random () и Random.nextInt (int) - PullRequest
       9

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

121 голосов
/ 10 апреля 2009

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

Ответы [ 4 ]

160 голосов
/ 10 апреля 2009

Вот подробное объяснение того, почему "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 () также требует примерно вдвое большей обработки и подлежит синхронизации.

27 голосов
/ 10 апреля 2009

еще один важный момент заключается в том, что Random.nextInt (n) повторяется, так как вы можете создать два объекта Random с одинаковым начальным числом . Это невозможно с помощью Math.random ().

14 голосов
/ 10 апреля 2009

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

0 голосов
/ 06 октября 2015

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

usingRandomClass: время: 328 милисекунда.

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));

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...