Tous les PRNG ne conviennent pas à toutes les utilisations. Par exemple, Java.util.SecureRandom utilise le hachage SHA1, dont la taille de sortie est de 160 bits. Cela signifie qu'il y a 2 160 les flux possibles de nombres aléatoires qui peuvent en découler. C'est aussi simple que cela. Vous ne pouvez pas obtenir plus de 2 160 les valeurs de l'état interne. Ainsi, vous ne pouvez pas obtenir plus de 2 160 des flux uniques de nombres aléatoires à partir d'une seule graine, quelle que soit l'origine de cette dernière. Windows CryptGenRandom est censé utiliser un état de 40 octets, il a 2 320 flux possibles de nombres aléatoires.
Le nombre de façons de mélanger un jeu standard de 52 cartes est de 52, soit environ 2. 226 . Ainsi, indépendamment de l'ensemencement, vous ne pourriez pas utiliser Java.util.SecureRandom pour mélanger un jeu de cartes. Il y a environ 2 66 les mélanges possibles qu'il ne peut pas produire. Bien sûr, nous ne savons pas lesquels ils sont...
Ainsi, si je disposais d'une source de, disons, 256 bits de véritable caractère aléatoire (par exemple, à partir d'une carte RNG Quantis), je pourrais ensemencer un PRNG comme CryptGenRandom() avec cette graine, puis utiliser le PRNG pour mélanger un jeu de cartes. Si je réensemence avec un véritable caractère aléatoire à chaque mélange, tout ira bien : imprévisible et statistiquement aléatoire. Si je faisais la même chose avec Java.util.SecureRandom, il y aurait des mélanges qui ne pourraient pas être produits, parce qu'il ne peut pas être ensemencé avec 256 bits d'entropie, et son état interne ne peut pas représenter tous les mélanges possibles.
Notez que les résultats de java.util.SecureRandom seraient à la fois imprévisibles et statistiquement aléatoires. Aucun test statistique ne permettrait d'identifier un problème ! Mais la sortie du RNG n'est pas assez grande pour couvrir le domaine complet de toutes les sorties possibles nécessaires pour simuler un jeu de cartes.
Et rappelez-vous, si vous ajoutez les jokers, c'est 54 ! que vous devez couvrir, ce qui nécessite environ 2 238 possibilités.