Конкретный пример
Мне нужно сгенерировать случайное число от 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?