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