web-dev-qa-db-fra.com

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

J'essayais de résoudre un problème de loisir qui nécessitait de générer un million de nombres aléatoires. Mais je me suis vite rendu compte qu'il devenait difficile de les rendre uniques. J'ai ramassé 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 pas du tout en mesure de comprendre.

Malheureusement, la génération de nombres aléatoires semble beaucoup plus facile qu'elle ne l'est réellement. En effet, il est fondamentalement impossible de produire des nombres vraiment aléatoires sur un quelconque appareil déterministe. Von Neumann [Neu63] l'a dit le mieux: "Quiconque envisage des méthodes arithmétiques de production de chiffres aléatoires est, bien sûr, dans un état de péché." Les meilleurs que nous puissions espérer sont des nombres pseudo-aléatoires, un flux de nombres qui semblent avoir été générés de manière aléatoire.

Pourquoi est-il impossible de produire des nombres vraiment aléatoires dans un appareil déterministe? Qu'est-ce que cette phrase veut dire?

48
Vinoth Kumar C M

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

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

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

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

Un périphérique déterministe produira toujours la même sortie lorsqu'il recevra les mêmes conditions de démarrage et les mêmes entrées - c'est ce que cela signifie d'être deterministic. "Un nombre vraiment aléatoire" est plus un point de vue philosophique, car que signifie random est le point crucial du nombril philosophique (les gens ne sont même pas certains si la désintégration atomique est aléatoire ou suit un schéma que nous ne peut pas encore comprendre). Un générateur de nombres aléatoires cryptographiquement sécurisé va prendre une source externe d'entropie pour rendre l'appareil non déterministe.

65
Tangurena

Le vrai hasard implique le non-déterminisme. S'il est déterministe, il peut être prédit avec précision (c'est ce que signifie le déterminisme); si elle peut être prédite, elle 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 (la non-répétition est impossible à moins que votre appareil RNG n'ait un stockage illimité) qui, pour la durée du cycle, produit un des nombres de flux qui répondent à toutes les autres propriétés d'une séquence aléatoire (une distribution uniforme des valeurs étant la plus intéressante).

Pour résoudre ce problème, de nombreux UNIX et likes Unix modernes ont des RNG du 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 RNG déterministe (srand(time(NULL)); en C); cryptographiquement parlant, cela ne vaut rien, car l'heure actuelle n'est pas un secret, mais pour des choses comme les simulations physiques ou les jeux vidéo, c'est assez bon.

22
tdammers

Le deuxième chapitre du livre Discrete-Event Simulation: A First Course de Lawrence Leemis donne une fantastique introduction aux générateurs de nombres aléatoires (ou plus précisément, les générateurs de nombres 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 de calcul: (a) les générateurs de recherche de tables de style années 1950 comme, par exemple, la table Rand Corporation d'un million de chiffres aléatoires; (b) des générateurs matériels comme, par exemple, des dispositifs thermiques à "bruit blanc"; et (c) 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 doit être:

  • aléatoire - capable de produire une sortie qui réussit tous les tests statistiques raisonnables du caractère aléatoire;
  • contrôlable - capable de reproduire sa sortie, si désiré;
  • portable - capable de produire la même sortie sur une grande variété de systèmes informatiques;
  • efficace - rapide, avec un minimum de ressources informatiques;
  • documenté - analysé théoriquement et largement testé.

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 recommande de mettre la main sur une copie de ce livre (ou sur quelque chose de similaire). Comprendre exactement comment le travail de PRNG vous aidera certainement dans vos efforts.

10
riwalk

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

Vous vous retrouvez donc en commençant par une "valeur (s) de départ" qui est choisie à "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 est basé sur la valeur originale Seed!

Donc si vous exécutez à nouveau votre code avec exactement la même Seed valeur initiale), vous obtiendrez le même ENSEMBLE EXACT de nombres! Comment une personne raisonnablement peut-elle appeler cela Mais c'est sûr REGARDE aléatoire.


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

7
Morons

Puisque vous générez des nombres aléatoires, vous devez vous attendre à ce que les valeurs générées ne soient pas uniques. C'est une propriété du caractère aléatoire - 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 de la plage, ainsi que de changer la probabilité de tous les numéros non choisis chaque fois qu'un nouveau est sélectionné.

5
James McLeod

J'ai une définition très simple de Pseudo Random:

Trop de variables inconnues à prévoir.

J'ai également 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 de certains valeur de départ.
Le mieux que nous puissions faire est de donner à l'ordinateur une valeur de départ pseudo-aléatoire, qui est généralement basée sur une variable que nous ne pouvons pas prédire (comme 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!

5
Scott Rippey

Générer des nombres vraiment aléatoires dans le logiciel n'est en effet pas possible comme d'autres l'ont souligné, cependant il est possible avec du matériel de construire un appareil qui peut générer des nombres vraiment aléatoires *. Il existe de nombreux exemples de cela sur Internet, et il existe une variété de méthodes utilisées, de la lecture du temps entre les tiques sur le compteur Geiger à l'échantillonnage du bruit blanc (principalement le rayonnement de fond de l'univers) d'un récepteur non réglé. J'ai moi-même construit quelques-uns en utilisant quelques-unes des méthodes disponibles.

* Tout bon connaisseur en physique soulignera que, compte tenu de la façon dont l'univers fonctionne, aucun de ces éléments n'est hyper-technique vraiment aléatoire, mais il n'y a pas raisonnable moyen de prédire les résultats donc pour le bien de cette discussion ils sont suffisants.

3
Unkwntech

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

Donc, si f(x) = z, f(x)! = Y à moins que y soit 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), elle renverra 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 envisage des méthodes arithmétiques de production de chiffres aléatoires est, bien sûr, dans un état de péché."

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

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

L'auteur de la citation va plus loin.

Les meilleurs que nous puissions espérer sont des nombres pseudo-aléatoires, un flux de nombres qui semblent avoir été générés de manière aléatoire.

Le contexte est précédemment défini comme étant "sur n'importe quel appareil déterministe". Je pourrais terminer l'argument ici. Mais que se passe-t-il si nous changeons 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. Cependant, en supprimant l'élément non déterministe, nous sommes réduits à un système déterministe. Si nous pouvons en quelque sorte retracer ou reproduire les entrées, nous pouvons reproduire un résultat. Mais ce paragraphe entier est tangetenial à ce que l'auteur dit. N'oubliez pas le contexte.

On pourrait discuter de la signification du non-déterminisme. Encore une fois, tangetenial. N'oubliez pas le contexte.

Il a donc raison. Sur tout appareil déterministe il est impossible pour un système déterministe de produire un vrai résultat aléatoire.

2
P.Brian.Mackey

Il n'y a aucun moyen de produire un nombre aléatoire sans matériel spécial. Dans ma première année, quelques camarades de classe et moi avons proposé un générateur de nombres aléatoires qui a essentiellement un récepteur AM et réglé sur 4 canaux différents, obtenez l'entrée dans un convertisseur A/D et ajoutez-les tous (modulo votre nombre maximum). Étant donné que la combinaison des entrées analogiques 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 avons proposé que cela puisse être un bon générateur. Bien sûr, même cela n'est pas vraiment aléatoire au sens philosophique, bien que cela puisse fonctionner pour la plupart des applications pratiques.

2
Balaji Viswanathan