Что такое хороший генератор случайных чисел для игры на C++?Что такое хороший генератор случайных чисел для игры?
Мои соображения: нужны
- Много случайных чисел, так что скорость хорошая.
- Игроки всегда будут жаловаться на случайные числа, но я хотел бы указать их на ссылку, объясняющую, что я действительно выполнял свою работу.
- Поскольку это коммерческий проект, на который у меня мало времени, было бы неплохо, если бы алгоритм либо a) был относительно прост в реализации, либо b) имел хорошую реализацию, отличную от GPL.
- Я уже использую
rand()
в довольно многих местах, поэтому любой другой генератор должен быть лучше, чтобы оправдать все изменения, которые потребуются.
Я мало знаю об этом предмете, поэтому единственной альтернативой, которую я мог бы придумать, является Mersenne Twister; удовлетворяет ли это всем этим требованиям? Что-нибудь еще лучше?
Редактировать: Mersenne Twister, по-видимому, является консенсусным выбором. Но как насчет точки №4? Действительно ли это намного лучше, чем rand()
?
Редактировать 2: Позвольте мне быть немного понятнее в пункте 2: игрокам не нужно обманывать, зная случайные числа. Период. Я хочу, чтобы это было достаточно случайным, чтобы люди (по крайней мере те, кто понимает случайность) не могут жаловаться на это, но меня не беспокоят прогнозы. Вот почему я ставлю скорость в качестве главного внимания.
Редактировать 3: Теперь я склоняюсь к RNG Marsaglia, но мне все равно нравится больше ввода. Поэтому я создаю щедрость.
Редактировать 4: Просто примечание. Я намерен принять ответ как раз перед полуночью UTC сегодня (чтобы не возиться с чьей-то защитой). Поэтому, если вы хотите ответить, не ждите до последней минуты!
Также мне нравятся генераторы XORshift от Marsaglia. Кто-нибудь знает о них?
Это зависит от того, какой профиль вам нужны ваши случайные числа; вы хотите, чтобы они были равномерно распределены? Gaussian? Дискретный или непрерывный? – Stobor
Stobor, вы можете сгенерировать другие дистрибутивы из однородных случайных чисел довольно хорошо. – Joey
Да, я знаю, что вы можете преобразовать любой тип в любой другой тип, но если вы знаете, что в первую очередь используете случайную переменную в дискретных бинарных решениях (true/false, left/right и т. Д.), Вы можете увеличить скорость, используя вместо использования целочисленного и вычисления (x> RAND_MAX/2) каждый раз. – Stobor