Самые стандартные классы-генераторы случайных чисел создают равномерно распределенные значения. Любое число возникает с одинаковой вероятностью – это ожидаемое поведение для большинства задач. Например, метод
Random.nextInt(1)
будет генерировать примерно одинаковое количество значений 0 и 1.Однако, программист легко может "испортить" равномерность значений последующими операциями. Возьмем вместо предыдущего примера
Random.nextInt(2)%2
. Такая конструкция тоже будет возвращать 0 или 1. Однако, третье возможное значение из генератора, 2, будет тоже превращено в 0. Значит, ответ 0 будет возникать в два раза чаще чем 1.Это та причина, по которой лучше не пользоваться общепринятым «школьным» арифметическим ограничением с помощью оператора
%
. Вместо этого следует оставить заботу о распределении разработчикам библиотеки, и пользоваться в прикладном коде готовыми методами с границами.Если задача подразумевает более плотную работу с распределениями, стоит воспользоваться специализированной библиотекой вроде Apache Commons Math.