Permettez-moi de m'excuser à l'avance, parce que c'est un peu difficile à comprendre...
Tout d'abord, vous savez déjà qu' java.util.Random
n'est pas complètement aléatoire à tous. Il génère des séquences parfaitement prévisible à partir de la graine. Vous avez totalement raison que, depuis la semence est seulement 64 bits, il ne peut que générer des 2^64 séquences différentes. Si vous étiez en quelque sorte à générer 64 réel de bits aléatoires et les utiliser pour sélectionner une graine, vous ne pourriez pas utiliser que des semences de choisir au hasard entre tous les 52! séquences possibles avec la même probabilité.
Toutefois, ce fait est sans conséquence, tant que vous n'êtes en fait pas va générer plus de 2^64 séquences, tant qu'il n'y a rien de "spécial" ou "nettement spécial" sur la 2^64 séquences qu'il peut générer.
Disons que vous avez eu une bien meilleure PRNG que utilisés 1000 bits graines. Imaginez que vous avez deux façons d'initialiser -- l'une de l'initialiser à l'aide de la graine entière, et l'une de hachage de la graine vers le bas à 64 bits avant de l'initialiser.
Si vous ne savez pas qui l'initialiseur était qui, pourriez-vous écrire toute sorte de test pour les distinguer? Sauf si vous avez été (de l'onu)la chance pour la fin de l'initialisation du mal avec la même 64 bits deux fois, alors la réponse est non. Vous ne pouvait pas distinguer entre les deux initialiseurs sans une connaissance détaillée de certaines faiblesses dans le PRNG mise en œuvre.
Sinon, imaginez que l' Random
classe un tableau de 2^64 séquences qui ont été sélectionnés sont complètement aléatoires et à un certain moment dans le passé lointain, et que la semence a été juste un indice dans ce tableau.
Donc le fait qu' Random
utilise uniquement 64 bits pour sa graine est en fait pas nécessairement un problème statistiquement, tant qu'il n'y a pas grande chance que vous allez utiliser les mêmes graines deux fois.
Bien sûr, pour cryptographique , un 64 bits de semences est tout simplement pas suffisant, car l'obtention d'un système à l'utilisation de la même semence deux fois calcul est possible.
EDIT:
Je dois ajouter que, même si tous les ci-dessus est correcte, que la mise en œuvre effective de l' java.util.Random
n'est pas génial. Si vous écrivez une carte de jeu, peut-être utiliser l' MessageDigest
API pour générer le hachage SHA-256 de "MyGameName"+System.currentTimeMillis()
, et d'utiliser ces bits à battre les cartes. Par l'argument ci-dessus, aussi longtemps que vos utilisateurs ne sont pas vraiment des jeux de hasard, vous n'avez pas à vous inquiéter currentTimeMillis
renvoie une longue. Si vos utilisateurs sont vraiment les jeux de hasard, puis utilisez SecureRandom
avec pas de postérité.