ensemencement correctement un RNG pour un jeu de cartes
-
26-10-2019 - |
Question
Je travaille sur un jeu de cartes et je dois l'algorithme de lecture aléatoire pour faire un très bon travail et être différent à chaque fois que les pistes de jeu et de ne pas avoir des séquences de cartes prévisibles.
J'utilise l'algorithme de Mersenne Twister mais il a encore besoin d'une graine, donc vraiment, même si elle produit un grand nombre, en ce moment il n'y a que 1000 séquences possibles de jeux depuis que je suis en utilisant le temps (NULL) aux semences. Comment dois-je ensemencement?
La solution
Ma technique de semis standard:
-
Si existe
/dev/urandom
, lu une graine à partir de là. -
Si vous êtes sous Windows, utilisez
CryptGenRandom()
. -
Si tout le reste échoue, utilisez
time()
.
(Je ne sais pas où votre Mersenne Twister vient, mais il y a nouvelle bibliothèque standard dispose d'un dans <random>
qui intègre avec beaucoup d'élégance.)
Je suis heureux d'entendre les suggestions des plates-formes qui ne sont pas couvertes par les deux premières étapes!
Autres conseils
Vous pouvez utiliser la source de l'entropie du système d'exploitation pour obtenir un bon nombre aléatoire la graine. Sous Windows, c'est CryptoAPI ; sur Posix, tirer octets de /dev/urandom
.
Une valeur typique de la graine est la faible 32 bits en un temps courant 64 bits. Par exemple, utilisez la valeur de retour d'appel Linux gettimeofday.