С ++ Генератор случайных чисел - обязательно? - PullRequest
1 голос
/ 01 октября 2011

Мой новый проект - разработка текстовой RPG, и теперь мне нужен генератор случайных чисел, хороший для вычисления в различных ситуациях, может ли какое-либо действие быть выполнено без проблем или нет. Каждый из нас знает, что основные функции std::srand и std::rand являются простыми и легкими алгоритмами для вычисления псевдослучайных значений. Однако я хочу иметь реальные, а не псевдо-значения. Поэтому я хочу спросить, будет ли это слишком излишним, если использовать лучшее решение, чем упомянутое, и придерживаться основ; и если нет, что бы вы предложили? Как реализовать такой «хороший генератор»?

Ответы [ 7 ]

7 голосов
/ 01 октября 2011

Я предлагаю использовать Boost.Random . Он имеет количество неплохих (и быстрых) ГСЧ . Вам не нужен криптографически защищенный, но те, которые они предлагают, лучше, чем rand.

Я бы сам пошел с mt19937 . Это имеет длительный период и довольно быстро. Но Boost.Random имеет лотов этих вещей для большинства ваших не криптографически безопасных потребностей.

3 голосов
/ 01 октября 2011

На самом деле вопрос ... кто-нибудь узнает разницу между вашими псевдо-и реальными случайными числами?Я не думаю, что кто-то будет.Библиотеки, которые вы найдете по умолчанию, достаточно надежны, чтобы ваши пользователи никогда не смогли найти никаких шаблонов.

2 голосов
/ 01 октября 2011

Может быть, вы запутались в нескольких разных понятиях.

Одной из концепций является непредсказуемость : поскольку PRGN основан на детерминистических алгоритмах и единственном начальном значении, можно прогнозировать следующее «случайное» число на основе наблюдений за предыдущими числами. Это огромная проблема в криптографии, поэтому, чтобы избежать этого, вы должны выбрать «истинное» случайное число из некоторого подлинного источника энтропии, такого как /dev/random. Однако это полезно только для одного случайного числа .

Другая концепция - это распределение вероятностей . Если вы хотите, чтобы числа равномерно распределялись по интервалу, вам нужен метод, чтобы добиться этого правильно, иначе ваши случайные события будут отображаться с перекосом. Это не связано с непредсказуемостью, и довольно предсказуемый псевдо-ГСЧ может быть полностью пригоден для получения статистически правильного равномерного (или любого производного) распределения.

Поскольку ваша игровая механика почти наверняка будет зависеть от хороших статистических свойств случайных событий, вам следует сосредоточиться в первую очередь на выборе хорошего псевдо-ГСЧ, а затем получить его из достаточно случайного источника (возможно, /dev/random). Истинная случайность бесполезна в игре, где вам нужно контролировать статистические свойства случайных событий.

1 голос
/ 01 октября 2011

Прежде всего, каждый генератор случайных чисел, реализованный в программном обеспечении, является псевдослучайным, вам нужно полагаться на некоторые физические явления (например, радиоактивный распад), чтобы получить гарантированную (согласно современной физике) случайность. Но в большинстве приложений (я не знаком с вами) случайность простых в вычислительном отношении псевдослучайных генераторов вполне приемлема. В TR1 было добавлено несколько таких возможностей, нет необходимости заново изобретать колесо, просто проверьте эту статью: Генерация случайных чисел с использованием C ++ TR1

1 голос
/ 01 октября 2011

Поскольку компьютеры являются детерминированными, любой генератор случайных чисел является псевдослучайным. Однако некоторые алгоритмы лучше других.

Для игры встроенный std :: rand функционирует более чем достаточно. Единственное реальное применение для более сложных генераторов случайных чисел - это шифрование.

1 голос
/ 01 октября 2011

От личного опыта зависит, как вы получаете доступ к случайным числам. Если вы генерируете много случайных чисел одно за другим в очень быстрой последовательности, то, скорее всего, вам понадобится что-то более сложное (например, создание большого вектора случайных значений). Однако для типичной RPG-игры стандартные RNG должны быть в порядке.

0 голосов
/ 01 октября 2011

В Linux, /dev/random является хорошим решением.

Для реальных случайных значений нельзя использовать только программу. Программное обеспечение не может генерировать истинные случайные значения. Но настоящая случайность вряд ли когда-либо понадобится.

Не могли бы вы конкретизировать, для чего вам нужны случайные числа?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...