Правильное засевание RNG для карточной игры
-
26-10-2019 - |
Вопрос
Я работаю над карточной игрой, и мне нужен алгоритм shuffle, чтобы сделать очень хорошую работу и быть разным каждый раз, когда игра работает и не иметь предсказуемых последовательностей карт.
Я использую алгоритм Mersenne Twister, но он все еще нуждается в семени, поэтому на самом деле, хотя он дает большие числа, прямо сейчас есть только 1000 возможных последовательностей игр, так как я использую время (NULL) для семян. Как мне посещать?
Решение
Моя стандартная техника посева:
Если
/dev/urandom
существует, читайте семя оттуда.Если вы находитесь в Windows, используйте
CryptGenRandom()
.Если ничего не удается, используйте
time()
.
(Не уверен, откуда приходит ваш Mersenne Twister, но есть у новой стандартной библиотеки есть одна в <random>
который интегрирует очень элегантно.)
Я рад услышать предложения для платформ, которые не покрываются первыми двумя шагами!
Другие советы
Вы можете использовать Источник энтропии операционной системы Чтобы получить хорошее случайное число семян. В окнах это Cryptoapi; На Posix вытащите байты из /dev/urandom
.
Типичным значением семян является низкое 32 бита в 64 -битное время тока. Например, используйте возвратное значение вызова Linux get TimeOfday.