Мені потрібна функція, яка б генерувала випадкове ціле число в заданому діапазоні (включаючи граничні значення). Я не пред'являю необґрунтованих вимог до якості / випадковості, у мене є чотири вимоги:
- Мені це потрібно, щоб бути швидким. Мій проект повинен генерувати мільйони (а іноді навіть десятки мільйонів) випадкових чисел, і моя поточна функція генератора виявилася вузьким місцем.
- Мені потрібно, щоб вона була достатньо рівномірною (використання rand () ідеально).
- діапазони min-max можуть бути від 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.
Не могли б ви запропонувати кращу формулу? (або навіть цілу функцію генератора псевдовипадкових чисел)