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