Правильный посев ГСЧ для карточной игры - PullRequest
0 голосов
/ 06 сентября 2011

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

Я использую алгоритм твистера Мерсенна, но ему все еще нужно начальное число, поэтому на самом деле, хотя оно дает большие числа, сейчас существует только 1000 возможных последовательностей игр, поскольку я использую время (NULL) для начального числа. Как мне посеять?

Ответы [ 3 ]

4 голосов
/ 06 сентября 2011

Моя стандартная техника высева:

  1. Если существует /dev/urandom, прочитайте оттуда семя.

  2. Если вы в Windows, используйте CryptGenRandom().

  3. Если ничего не помогло, используйте time().

(Не уверен, откуда взялся твистер Мерсенна,но в новой стандартной библиотеке есть одна в <random>, которая очень элегантно интегрируется.)

Я рад услышать предложения для платформ, которые не охватываются первыми двумя шагами!

1 голос
/ 06 сентября 2011

Вы можете использовать источник энтропии операционной системы , чтобы получить хорошее начальное число случайных чисел. В Windows это CryptoAPI ; в POSIX извлекайте байты из /dev/urandom.

0 голосов
/ 06 сентября 2011

Типичным начальным значением являются младшие 32 бита в 64-битном текущем времени. Например, используйте возвращаемое значение Linux gettimeofday call.

...