Мне нужна функция, которая генерирует случайное целое число в заданном диапазоне (включая значения границ). У меня нет необоснованных требований к качеству/случайности, у меня есть четыре требования:
- Мне нужно, чтобы это было быстро. Мой проект должен генерировать миллионы (или иногда даже десятки миллионов) случайных чисел, и моя текущая функция генератора оказалась узким местом.
- Мне нужно, чтобы он был достаточно однородным (использование rand() отлично подходит).
- диапазоны min-max могут быть любыми от < 0, 1 > до < -32727, 32727 > .
- он должен быть посеянным.
В настоящее время у меня следующий код на С++:
output = min + (rand() * (int)(max - min) / RAND_MAX)
Проблема заключается в том, что она не является однородной - max возвращается только тогда, когда rand() = RAND_MAX (для Visual С++ это 1/32727). Это основная проблема для небольших диапазонов, таких как < -1, 1 > , где последнее значение почти никогда не возвращается.
Итак, я схватил ручку и бумагу и придумал следующую формулу (которая основывается на (int) (n + 0.5) целочисленном трюке округления):
Но это все равно не дает мне равномерного распределения. Повторные пробеги с 10000 отсчетами дают мне отношение 37:50:13 для значений значений -1, 0. 1.
Не могли бы вы предложить лучшую формулу? (или даже целую функцию генерации псевдослучайных чисел)