Pourquoi est-il impossible de produire des nombres vraiment aléatoires?


47

J'essayais de résoudre un problème de loisir qui nécessitait la génération d'un million de nombres aléatoires. Mais je me suis vite rendu compte qu'il devenait difficile de les rendre uniques. J'ai pris Algorithm Design Manual pour en savoir plus sur la génération de nombres aléatoires.

Il contient le paragraphe suivant que je ne suis absolument pas capable de comprendre.

Malheureusement, générer des nombres aléatoires semble beaucoup plus facile qu’il ne l’est réellement. En effet, il est fondamentalement impossible de produire des nombres véritablement aléatoires avec un appareil déterministe. Von Neumann [Neu63] a dit le mieux: «Quiconque considère des méthodes arithmétiques pour produire des chiffres aléatoires est, bien sûr, dans un état de péché.» Le mieux que nous puissions espérer est un nombre pseudo-aléatoire, si elles ont été générées aléatoirement.

Pourquoi est-il impossible de produire des nombres véritablement aléatoires dans un appareil déterministe? Que signifie cette phrase?


86
Voulez-vous vraiment savoir pourquoi vous ne pouvez pas produire de nombres vraiment aléatoires sur un appareil déterministe ? La question n'inclut-elle pas déjà la réponse?
Herby

37
Si tous les nombres que vous générez doivent être uniques, ils ne sont pas vraiment aléatoires. Il est tout à fait possible qu'un véritable générateur de nombres aléatoires donne le même résultat dix fois de suite.
TMN

28
Il y a une faille dans la recherche de nombres aléatoires uniques . Si vous voulez que les nombres soient uniques , alors ils ne sont pas aléatoires, car aléatoirement, ils demandent la possibilité de répétition , aussi improbable soit-il.
Mark Booth

13
En dehors de l'ordinateur, y a-t-il un nombre vraiment aléatoire? Jeter un dé, c'est de la physique avec beaucoup de vecteurs.
MPelletier

9
@MPelletier: Pas tout à fait. La mécanique quantique pourrait (une fois que les scientifiques en ont déduit plus en détail) impliquer l’existence d’un véritable caractère aléatoire, en fonction de votre définition du caractère aléatoire.
Brian

Réponses:


65

On devrait rechercher un générateur de nombres pseudo-aléatoires cryptographiquement sécurisé . La plupart PRNG sont générateurs de congruence linéaires (donc next numberest une fonction linéaire de previous number), donc si vous tracer next numbervs previous numbervous obtiendrez un tableau de lignes parallèles. Un CSPRNG ne fera pas cela. Le compromis est qu'ils sont lents.

Je groupe les générateurs de nombres aléatoires en 3 catégories :

  1. Assez bon pour les devoirs.
  2. Assez bon pour parier votre compagnie.
  3. Assez bon pour parier votre pays.

Pourquoi est-il impossible de produire des nombres véritablement aléatoires dans un appareil déterministe?

Un appareil déterministe produira toujours la même sortie lorsque les mêmes conditions de démarrage et les mêmes entrées sont remplies - c'est ce que cela signifie deterministic. "Nombre véritablement aléatoire" est plutôt un point de vue philosophique, car ce que cela signifie, randomc'est le coeur du regard philosophique sur le nombril (les gens ne savent même pas si la désintégration atomique est aléatoire ou suit un modèle que nous ne pouvons tout simplement pas comprendre. encore). Un générateur de nombres aléatoires cryptographiquement sécurisé utilisera une source d'entropie externe pour rendre le dispositif non déterministe.


1
C'est pourquoi il est impossible d'obtenir un nombre vraiment aléatoire. Même si la séquence ne se répète jamais, qui n'est pas garanti au hasard des nombres, une autre exécution du programme avec les mêmes entrées seront les mêmes résultats. Ainsi, quelqu'un d'autre peut reproduire vos nombres aléatoires plus tard, ce qui signifie que ce n'était pas vraiment aléatoire.
Spencer Rathbun

2
@ user973810 Le problème de cette définition de la théorie de l'information est que vous ne pouvez pas montrer une instance réelle d'une séquence aléatoire. Nous pouvons prouver, pour tout langage de définition raisonnable, que presque chaque séquence infinie (au sens technique) est aléatoire, car elle ne peut pas du tout être décrite dans le langage. Ce qui est plus utile, c'est le concept de générateur de séquence aléatoire: pas un générateur de séquence aléatoire, mais un générateur de séquence aléatoire.
Gilles 'SO- arrête d'être méchant'

13
Léger nitpick: certaines personnes, notamment les physiciens du nucléaire et des particules, sont assez certaines que les processus tels que la désintégration atomique sont vraiment aléatoires.
David Z

9
@ David: Nous pouvons même aller un peu plus loin que cela. Les différentes expériences sur l'inégalité de Bell montrent que certains processus quantiques sont définitivement imprévisibles . Ils peuvent être aléatoires au sens philosophique du terme ou dépendre de variables cachées non locales, mais les deux cas empêchent une prédiction fiable.
dmckee

7
@dmckee: Oui, je pensais qu'il serait plus facile d'éviter d'essayer d'expliquer le lien entre l'inégalité de Bell et l'effondrement de la fonction d'onde dans les commentaires sur prog.SE. Les gens peuvent toujours venir sur notre site s’ils sont curieux ;-) Tangurena: c’est vrai, Einstein a dit cela, mais cela voulait simplement dire qu’il voulait vraiment que l’univers soit déterministe. Ce n'est pas, cependant. Les expériences effectuées après la mort d'Einstein ont montré que c'était assez concluant (à l'exception des variables cachées non locales, ou étrangeté ). Ce n’est pas parce qu’il est Einstein qu’il avait raison à propos de tout.
David Z

22

Le vrai hasard implique le non déterminisme. Si c'est déterministe, on peut le prédire avec précision (c'est ce que le déterminisme signifie); si on peut le prédire, ce n'est pas aléatoire.

La meilleure chose que vous puissiez obtenir d’un générateur de nombres pseudo-aléatoires déterministes est un flux de nombres qui a un cycle très long (il est impossible de répéter l'opération, sauf si votre dispositif RNG dispose d'une mémoire de stockage illimitée) qui, pour la longueur du cycle, produit une numéros de flux qui répondent à toutes les autres propriétés d'une séquence aléatoire (une distribution uniforme de valeurs étant la plus intéressante).

Pour résoudre ce problème, de nombreux UNIX modernes et similaires à Unix ont des RNG de noyau qui utilisent des sources de bruit physiques pour générer un véritable caractère aléatoire.

Une autre approche courante consiste à prendre l’heure actuelle comme germe pour un GNR déterministe ( srand(time(NULL));en C); cryptographiquement parlant, cela n’a aucune valeur, car l’heure actuelle n’est pas un secret, mais il vous suffit pour des choses comme les simulations physiques ou les jeux vidéo.


Notez que la non répétition est également impossible pour tout générateur avec une valeur de sortie limitée (nombre de bits limité). Mais bien sûr, la longueur de cycle d'un générateur déterministe est très probablement beaucoup plus courte que le maximum théorique, ce qui correspond à toutes les permutations possibles.
9000

@ 9000: Bien sûr, ce n'est pas vrai. Prenez un nombre irrationnel d'utilisation des chiffres (n'importe quelle base) comme séquence "aléatoire". Boom! séquence non répétée (par définition) et toujours délimitée (à votre base).
ThePopMachine

@ThePopMachine: vous pouvez générer une séquence non répétitive de bits de longueur quelconque, équivalente à une séquence non répétitive de nombres de longueur non limitée. Vous ne pouvez pas générer une séquence non répétée de nombres entiers de magnitude limitée (par exemple 32 bits); une fois que vous avez généré toutes les permutations de valeurs 32 bits, une séquence doit être répétée. Tu as raison; nous ne parlons que de choses différentes.
9000 le

@ 9000: Pas de tissage. Vous avez fait une déclaration générale qui est fausse. Si vous essayez simplement de faire en sorte qu'il n'y ait pas plus de n ^ k séquences différentes de longueur k pour n valeurs différentes, et qu'il faut donc qu'elles se répètent, c'est alors assez évident et sans intérêt.
ThePopMachine

2
@ThePopMachine: J'apprécierais si vous atténuiez un peu. Pour citer, «la non-répétition est également impossible pour tout générateur avec une valeur de sortie limitée (nombre de bits limité)». Ce dont vous parlez explicitement est un nombre illimité de bits, sous la forme d'une séquence de chiffres [binaires] d'un nombre irrationnel. Votre affirmation, bien que vraie, n’a aucun rapport avec le problème.
9000 le

10

Le deuxième chapitre du livre Simulation à événements discrets: un premier cours de Lawrence Leemis est une introduction fantastique aux générateurs de nombres aléatoires (ou plus précisément, aux générateurs de nombres aléatoires pseudo-aléatoires).

Un extrait de son livre l'explique bien à mon avis:

Historiquement, trois types de générateurs de nombres aléatoires ont été préconisés pour les applications informatiques: (a) des générateurs de recherche de table de style années 1950, tels que, par exemple, la table de sociétés RAND d'un million de chiffres aléatoires; (b) des générateurs matériels tels que, par exemple, des dispositifs thermiques à "bruit blanc"; et (c) des générateurs algorithmiques (logiciels). De ces trois types, seuls les générateurs algorithmiques ont été largement acceptés. La raison en est que seuls les générateurs algorithmiques ont le potentiel de satisfaire à tous les critères de génération de nombres aléatoires généralement bien acceptés suivants. Un générateur devrait être:

  • random - capable de produire une sortie qui passe tous les tests statistiques raisonnables du caractère aléatoire;
  • contrôlable - capable de reproduire sa sortie, si désiré;
  • portable - capable de produire le même résultat sur une grande variété de systèmes informatiques;
  • efficace - rapide, avec des besoins en ressources informatiques minimaux;
  • documenté - théoriquement analysé et testé de manière approfondie.

Ainsi, bien qu'il soit possible d'utiliser un générateur de bruit blanc pour obtenir de "meilleurs" nombres aléatoires, ils n'ont pas été acceptés, car ils ne respectent pas la plupart des critères ci-dessus.

Je vous recommanderais de mettre la main sur un exemplaire de ce livre (ou quelque chose de similaire). Comprendre exactement comment le travail de PRNG vous aidera dans vos efforts.


7

Parce que vous devez écrire du code pour générer les nombres aléatoires et que Code n'est PAS aléatoire. (C'est déterministe)

Vous commencez donc par une "valeur de départ" sélectionnée sur "Aléatoire" (généralement l'horodatage actuel), puis vous l'utilisez dans un algorithme pour commencer à générer des nombres. Mais l'ensemble de est basé sur la valeur d'origine de la graine!

Donc, si vous exécutez à nouveau votre code avec la même valeur de semences, vous obtiendrez le même ensemble de chiffres EXACT! Comment une personne raisonnable peut-elle appeler cela au hasard? Mais il ne vous REGARD au hasard.


Pour ce qui est de les rendre uniques, après avoir généré un numéro, vérifiez simplement si vous avez déjà ce numéro, le cas échéant, jetez-le et générez-en un nouveau.


13
Du côté positif, des nombres pseudo-aléatoires répétables peuvent être intéressants pour le débogage.
David Thornley

5

Puisque vous générez des nombres aléatoires, vous devez vous attendre à ce que les valeurs générées soient non uniques. Ceci est une propriété du hasard - vous ne pouvez pas dire qu'une séquence de nombres vraiment aléatoires (ou même pseudo-aléatoires) est unique, car cette exigence permettrait de prédire la valeur finale dans la plage, ainsi que de modifier la probabilité de tous les numéros non choisis chaque fois qu'un nouveau est sélectionné.


1
Il s’agit en réalité d’un commentaire plutôt que d’une réponse, car cela ne répond pas vraiment à la question .
Mark Booth

5

J'ai une définition très simple de pseudo-aléatoire :

Trop de variables inconnues à prédire.

J'ai aussi une définition simple de True Random :

Variables inconnues infinies.

Le problème avec un ordinateur est qu’il connaît toujours TOUTES les variables. Le nombre aléatoire est simplement une fonction mathématique d'une valeur de départ .
Le mieux que nous puissions faire est de donner à l'ordinateur une valeur de départ pseudo-aléatoire, généralement basée sur une variable que nous ne pouvons pas prédire (telle que l'heure exacte).

Même si un ordinateur est absolument incapable de créer un nombre aléatoire, il est bon pour introduire trop de variables à prévoir!


1
Eh bien, "le temps" est un mauvais exemple de quelque chose qui ne peut être prédit. Les mouvements de la souris, l'entrée du microphone, etc. sont en revanche des entrées imprévisibles.
HoLyVieR

3

La génération de nombres réellement aléatoires dans le logiciel n’est en effet pas possible, comme d’autres l'ont déjà souligné, mais il est possible avec un matériel informatique de créer un dispositif capable de générer des nombres réellement aléatoires *. Il existe de nombreux exemples de ce type sur Internet, et diverses méthodes sont utilisées, allant de la lecture du compteur Geiger entre les ticks et à l’échantillonnage du bruit blanc (principalement le rayonnement de fond de l’univers) d’un récepteur non accordé. J'ai moi-même construit quelques-unes en utilisant quelques-unes des méthodes disponibles.

* Tout bon connaisseur en physique remarquera que, compte tenu de la façon dont l’univers fonctionne, aucun de ceux-ci n’est hyper-technique, mais il n’existe aucun moyen raisonnable de prédire les résultats.


5
En tant que geek en physique à temps partiel, les générateurs basés sur des événements quantiques sont (pour autant que nous ayons pu le dire) vraiment aléatoires. Les personnes qui n'aiment pas le hasard tentent de supprimer le hasard de la mécanique quantique depuis le début, et tout ce que cela a été fait, c'est de rassembler davantage de preuves que c'est vraiment aléatoire.
David Thornley

@DavidThornley, ... jusqu'à ce que quelqu'un trouve la formule.
CaffGeek

1
@Chad: Il n'y a pas de formule au sens habituel. cela a été écarté par les expériences EPR. Il est certainement concevable que tout soit déterministe, mais pas d'une manière facilement compréhensible.
David Thornley

@ DavidThornley, je savais que ce n'était pas le bon mot. Je pense que nous savons ce que j'essayais de dire. Presque chaque fois que quelqu'un dit que quelque chose est impossible, quelqu'un d'autre leur prouve finalement le contraire. C'est la nature humaine.
CaffGeek

2
C'est un peu comme dire que quelqu'un finira par fabriquer une machine capable de résoudre le problème de blocage, car quelqu'un a dit que c'était impossible. Il ne s’agit pas de trouver l’équation, c’est en réalité une opération aléatoire en fonction de toutes les expériences réalisées et des calculs qui la corroborent.
Alex

2

Il n’ya aucun moyen de produire un nombre aléatoire sans matériel spécial. Lors de ma première année, quelques camarades de classe et moi avons proposé un générateur de nombres aléatoires doté d'un récepteur AM et syntonisé sur 4 canaux différents, permettant l'entrée dans un convertisseur A / N et les ajoutant tous (modulo votre nombre maximum). Étant donné que la combinaison des entrées analogiques provenant de tout nombre arbitraire de stations est aléatoire et que nous pourrions produire un grand nombre de nombres aléatoires à partir du convertisseur A2D, nous proposons qu'il s'agisse d'un bon générateur. Bien sûr, même cela n’est pas vraiment aléatoire au sens philosophique du terme, bien que cela puisse fonctionner dans la plupart des cas.


2

Le déterminisme est essentiellement une fonction. Rappelez-vous d'Algèbre qu'une fonction est une correspondance entre un domaine et une plage telle que chaque membre du domaine corresponde exactement à un membre de la plage.

Donc, si f (x) = z, f (x)! = Y sauf si y est z. C'est une fonction. Imaginez JavaScript:

function Add(A, B) {
      return A + B;
}

var addedNumber = Add(2,3);//returns 5
addedNumber = Add(2,3);//still 5

Peu importe le nombre de fois que vous appelez, Add(2,3)le résultat sera toujours 5. En d'autres termes, Add () est une fonction déterministe.

Des facteurs externes peuvent faire en sorte que Add se comporte de manière non déterministe. Par exemple, si vous introduisez le multithreading dans l'équation. L'apport humain provoque également le non-déterminisme.

Maintenant, c’est là que les choses deviennent intéressantes.

"Quiconque considère des méthodes arithmétiques pour produire des chiffres aléatoires est, bien sûr, dans un état de péché."

Remarque Von Neumann déclare "des méthodes arithmétiques de production [...]". Il ne s'agit pas d'entrée humaine, de simultanéité, de vitesses de vent échantillonnées lues à partir d'un instrument précis ou d'autres moyens non algorithmiques de produire une entrée aléatoire pour une fonction déterministe.

Cela indique simplement qu'une fonction ou un système de fonctions ne va pas devenir soudainement non déterministe. En d'autres termes, Add (2,3) ne retournera pas 6 ou autre chose que 5 avec les mêmes entrées . C'est impossible.

L'auteur citant va encore plus loin.

Le mieux que nous puissions espérer est un nombre pseudo-aléatoire, un flot de nombres qui apparaissent comme s'ils avaient été générés aléatoirement.

Le contexte est précédemment défini comme étant "sur tout dispositif déterministe". Je pourrais mettre fin à la discussion ici. Mais que se passe-t-il si nous modifions le contexte en introduisant un nouvel élément dans le système? Un élément non déterministe ajouté en entrée fait du système un système non déterministe. Bien que, en supprimant l'élément non déterministe, nous sommes réduits à un système déterministe. Si nous pouvons en quelque sorte tracer ou reproduire les entrées, nous pouvons reproduire un résultat. Mais tout ce paragraphe correspond à ce que dit l'auteur. Rappelez-vous le contexte.

On pourrait discuter du sens du non-déterminisme. Encore une fois, tangetenial. Rappelez-vous le contexte.

Alors il a raison. Quel que soit le dispositif déterministe, il est impossible pour un système déterministe de produire un véritable résultat aléatoire.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.