Конкретный пример
Мне нужно сгенерировать случайное число от 0 до 2 включительно. (или выберите случайным образом между -1, 0 и 1).
Наивный подход заключался бы в том, чтобы сделать что-то вроде rand() mod 3
, где rand()
возвращает целое число. Этот подход не будет генерировать статистически случайные числа, если верхняя граница rand()
не является относительно простой (а нижняя граница равна 0).
Например, предполагая, что rand () вернула 2 бита (от 0 до 3 включительно), модуль будет отображать:
0 -> 0
1 -> 1
2 -> 2
3 -> 0
Этот перекос в сторону 0, очевидно, был бы намного меньше, если бы было возвращено больше битов, но, тем не менее, перекос останется.
Общий вопрос
Есть ли способ сгенерировать равномерно распределенное случайное число от 0 до n-1 включительно, где n относительно просто 2?