В чем разница между 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().
Согласно этому примеру Random.nextInt(n) имеет менее предсказуемый результат, чем Math.random() * n. Согласно [сортируемый массив быстрее, чем несортированный массив] [1] Я думаю, мы можем сказать, что Random.nextInt (n) трудно предсказать.
Использование Randomclass : время:328 миллисекунд.
Использование mathsrandom : время:187 миллисекунд.