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