Как лучше всего ограничить значения PRNG меньшим диапазоном? Если вы используете модуль, а старое максимальное число не делится поровну на новое максимальное число, которое вы смещаете в сторону от 0
до (old_max - new_max - 1)
. Я предполагаю, что лучшим способом было бы что-то вроде этого (это с плавающей точкой, а не целочисленная математика)
random_num = PRNG() / max_orginal_range * max_smaller_range
но что-то в моей голове заставляет меня задаться вопросом об этом методе (может быть, реализация с плавающей запятой и различия в представлении?).
Генератор случайных чисел будет давать согласованные результаты для аппаратных и программных платформ, и это ограничение также необходимо.
Я был прав, когда усомнился в псевдокоде выше (но не по тем причинам, о которых я думал). ответ MichaelGG заставил меня задуматься о проблеме по-другому. Я могу смоделировать это, используя меньшие числа и проверить каждый результат. Итак, давайте предположим, что у нас есть PRNG, который генерирует случайное число от 0 до 31, и вы хотите, чтобы меньший диапазон был от 0 до 9. Если вы используете модуль, вы смещаете в сторону 0, 1, 2 и 3. Если вы используете псевдокод выше вас смещение в сторону 0, 2, 5 и 7. Я не думаю, что может быть хороший способ отобразить один набор в другой. Лучшее, что я придумала до сих пор, - это регенерирование случайных чисел, которые больше old_max/new_max
, но у них также есть серьезные проблемы (сокращение периода, времени для генерации новых чисел, пока один не окажется в нужном диапазоне, и т. Д.). .).
Думаю, я наивно подошел к этой проблеме. Возможно, пришло время начать серьезное исследование литературы (кто-то должен был заняться этим раньше).