684 votes

En quoi les nombres pseudo-aléatoires et les nombres véritablement aléatoires sont-ils différents et pourquoi est-ce important ?

Je n'ai jamais vraiment compris ça. Disons que vous écrivez un petit programme dans n'importe quel langage qui lance des dés (en utilisant les dés comme exemple). Après 600 000 lancers, chaque numéro aura été lancé environ 100 000 fois, ce qui correspond à ce que j'attends.

Pourquoi existe-t-il des sites web consacrés au "vrai hasard" ? Compte tenu de l'observation ci-dessus, il est certain que les chances d'obtenir un numéro sont presque exactement égales à 1 sur le nombre de numéros parmi lesquels il peut choisir.

Je l'ai essayé dans Python : Voici le résultat de 60 millions de lancers. La plus grande variation est de 0,15. Ce n'est pas aussi aléatoire que ça peut l'être ?

1 - 9997653 2347.0
2 - 9997789 2211.0
3 - 9996853 3147.0
4 - 10006533 -6533.0
5 - 10002774 -2774.0
6 - 9998398 1602.0

2voto

Superbest Points 1910

Pourquoi le véritable caractère aléatoire est-il important ?

Il y a essentiellement deux raisons principales pour lesquelles un véritable caractère aléatoire est nécessaire :

  1. Si vous utilisez le RNG pour la cryptographie (y compris des choses comme les jeux d'argent réel et la gestion d'une loterie), alors un PRNG rendra votre chiffrement beaucoup plus faible que l'analyse mathématique de celui-ci (qui suppose un TRNG) ne le laisserait croire. Le PRNG ne sera pas réellement aléatoire, mais aura un modèle - les adversaires peuvent exploiter le modèle pour craquer un chiffrement qui aurait dû être inviolable.
  2. Si vous utilisez le RNG pour simuler des entrées "aléatoires", par exemple pour des tests de bogues ou des simulations, alors un PRNG affaiblit votre approche. Lorsque vous ne découvrez aucun bug, il y aura toujours ce doute lancinant : existe-t-il un bug qui n'est pas perceptible avec le modèle de mon PRNG, mais qui serait apparu si j'avais utilisé un TRNG ? Les résultats de ma simulation décrivent-ils fidèlement la réalité, ou le phénomène que j'ai découvert est-il simplement un artefact du modèle PRNG ?

En dehors de ces zones, cela n'a pas vraiment d'importance. Mise en garde : si votre PRNG est très, très mauvais, il peut encore être inadapté - vous ne voulez pas faire un jeu de Craps où les dés sortent toujours pairs, vos joueurs n'aimeraient pas ça.

En quoi le PRNG de Python n'est-il pas suffisant ?

Il est très peu probable que vous puissiez détecter les pièges d'un véritable RNG en utilisant une méthodologie aussi simple. L'analyse statistique des RNG est un domaine scientifique à part entière, et des tests très sophistiqués sont disponibles pour évaluer le "caractère aléatoire" d'un algorithme. Ces tests sont beaucoup plus avancés que votre simple tentative.

Tous les développeurs de logiciels qui créent des bibliothèques du monde réel, comme les développeurs de Python, utilisent ces tests statistiques pour déterminer si la mise en œuvre de leur PRNG est suffisamment bonne. Par conséquent, à l'exception des cas de négligence réelle de la part des développeurs, il est très peu probable que vous puissiez détecter facilement un modèle dans un PRNG du monde réel. Cela ne veut pas dire qu'il n'y a pas de modèle - un PRNG a un modèle par définition.

1voto

Dice9 Points 191

Fondamentalement, vous ne pouvez pas prouver qu'une source est aléatoire par une analyse mathématique de la sortie, vous avez besoin, par exemple, d'un modèle physique qui dit que la source est aléatoire (comme dans la désintégration radioactive).

Vous pouvez simplement exécuter des tests par lots pour trouver une corrélation statistique dans les données de sortie, dans ce cas, il est prouvé que les données ne sont pas aléatoires (mais une source aléatoire peut aussi avoir des sorties non aléatoires, ou elle ne sera pas vraiment aléatoire si elle ne peut pas donner de sortie spécifique). Sinon, si les tests sont réussis, on peut dire que les données sont pseudo-aléatoires.

Réussir certains tests d'aléatoire signifie seulement que vous avez un bon PRNG (générateur de nombres pseudo-aléatoires), ce qui peut être utile pour les applications où la sécurité n'est pas en jeu.

Si la sécurité est en jeu (c'est-à-dire le cryptage, la génération d'un sel de clé, la génération de nombres aléatoires pour les jeux d'argent...), il ne suffit pas d'avoir un bon PRNG, il faut qu'il ait des qualités supplémentaires, comme le fait que la sortie de la fonction ne peut pas être facilement devinée à partir des sorties précédentes, la fonction doit avoir un coût de calcul souhaitable (suffisamment limité pour être utilisable, mais suffisamment élevé pour vaincre les tentatives de forçage brut), le matériel qui exécute la fonction - ou le dispositif, dans le cas aujourd'hui étrange où il s'agit d'un dispositif analogique - ne doit pas être facilement trafiqué, etc.

Avoir un bon PRNG peut être utile dans les jeux pour créer des modèles nouveaux et imprévisibles, et dans le cryptage - trop lourd à expliquer dans un seul post, il suffit de penser comme un rôle de pouce ce que la sortie de la procédure de cryptage devrait être pseudo-aléatoire, ne pas montrer des modèles qui pourraient relier les données cryptées précédentes avec les données cryptées suivantes, ou relier les données de texte en clair aux données cryptées, ou relier deux ciphertexts différents l'un l'autre (de sorte que les suppositions peuvent être faites sur les textes en clair).....

-5voto

magallanes Points 521

Une histoire courte :

Génère une graine aléatoire en utilisant la microseconde actuelle du système.

Cette astuce est assez ancienne et est toujours fonctionnelle.

A l'exception de la force du facteur brut, où je peux déterminer chaque combinaison en "pariant" sur tous les nombres possibles et ce n'est pas le but de cette question, surtout quand la plupart des nombres aléatoires sont arrondis avant son utilisation.

Disons, par exemple, que je peux déterminer la semence utilisée en utilisant seulement 10 valeurs. Donc, connaissant la graine, je peux deviner la valeur suivante.

Si j'utilisais le seed=1, je pourrais obtenir la séquence suivante :

1, 2, 3, 4, 5, 6, 7, 8, 9... (et je déduis que la graine utilisée id 1 et la valeur suivante 10)

Mais, que se passera-t-il si l'on change l'envoi toutes les "nièmes" valeurs ? Changer la graine par les microsecondes actuelles est une astuce bon marché (c'est-à-dire qu'elle ne nécessite pas beaucoup de cycles CPU).

Donc la séquence est maintenant : (seed=1) 1, 2, 3, 4, 5, (seed=2), 7, 9, 11, 13... (15 ?)

Dans ce cas :

a) Je ne peux pas déduire quelle graine a été utilisée.

b) Ergo, je ne peux pas deviner la prochaine valeur.

c) La seule supposition que je puisse faire est de déduire que la prochaine graine pourrait être un nombre majeur.

Quoi qu'il en soit, la plupart des algorithmes modernes de génération aléatoire utilisent déjà cette astuce sous le capot.

Le fait est que, nous n'avons pas besoin d'un ordinateur quantique pour créer un "vrai" nombre aléatoire, l'imprécision de notre Quartz de notre ordinateur agit comme un générateur aléatoire, aussi l'efficacité aléatoire de notre CPU est aussi variable sans considérer que le CPU fait habituellement plusieurs tâches en même temps.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X