Un générateur de nombres aléatoires peut-il jamais produire une sortie différente avec des graines identiques?


10

Le titre le résume. Je suis intéressé de savoir s'il existe un algorithme capable de produire une sortie variable avec une entrée identique sans s'appuyer sur d'autres sources pour l'aléatoire comme DateTime.Now ou un nombre généré à partir d'un capteur de lumière, etc. En outre, l'algorithme ne peut pas être exécuté en séquence, seulement deux exécutions distinctes et indépendantes qui produisent une sortie différente.


Ce dont vous parlez est un générateur de nombres pseudo-aléatoires, pour être précis.
Marcel

La plupart des langues offrent la possibilité d'instancier un générateur de nombres aléatoires sans avoir à spécifier la graine afin que la graine soit également "aléatoire". Il y a une raison pour laquelle les graines sont utilisées.
Neil

1
@Neil: dans ces cas, il y a encore une graine, c'est juste implicite, généralement l'heure du système.
Michael Borgwardt

@MichaelBorgwardt, j'ai simplement dit que la graine serait également aléatoire. Bien sûr, rien n'est vraiment aléatoire, mais généralement, l'heure système fournit une graine décente, tant que vous n'instanciez pas souvent un générateur de nombres aléatoires sans passer une graine, auquel cas vous pouvez obtenir deux fois la même graine "aléatoire".
Neil

Il existe un domaine de recherche intéressant sur le matériel inexact, qui présente une inexactitude statistiquement bien définie. L'avantage potentiel est une consommation d'énergie moindre. Le simple calcul 2.0 + 2.0sur un tel système ne donnerait pas des résultats identiques. Il n'a pas besoin d'une autre source de hasard.
MSalters

Réponses:


15

Je suis intéressé de savoir s'il existe un algorithme capable de produire une sortie variable avec une entrée identique sans s'appuyer sur d'autres sources pour l'aléatoire comme DateTime.Now ou un nombre généré à partir d'un capteur de lumière, etc.

Non, c'est fondamentalement impossible, car la définition même d'un algorithme est qu'il est bien défini et déterministe, c'est-à-dire que la même entrée produira toujours la même sortie. Il existe des algorithmes randomisés, mais ils nécessitent un caractère aléatoire en entrée.

En outre, le déterminisme est l' objectif de conception le plus important du matériel informatique. Un processeur qui ne produit pas la même sortie avec la même entrée serait totalement inutile pour la plupart des applications.


14

Non, un algorithme de génération de nombres pseudo-aléatoires produira toujours la même sortie étant donné la même graine (donc pseudo- aléatoire).

Je trouve intéressant que vous utilisiez le terme «algorithme» plutôt que «programme». Cela exclut une certaine classe de réponses oui (erreurs logicielles dans la RAM, différents entrelacements de threads dans un RNG multithread, etc.). Si vous considérez comme acquis que chaque exécution de votre algorithme prend la même entrée à chaque itération est bien spécifiée sans aléatoire, alors il générera la même sortie à chaque exécution.

Cela étant dit, même des éléments de base comme la température du processeur sont suffisamment imprévisibles pour agir comme une source d'entropie s'ils sont normalisés de manière appropriée. Donc, ne pensez pas que cela implique qu'un générateur de nombres aléatoires "cryptographiquement sécurisé" peut être prédit si vous savez à quelle heure il a été exécuté; beaucoup d'entre eux utilisent un flux d'entropie généré par le système.


Algorithme était le bon mot :) J'essaie spécifiquement d'éliminer les sources externes d'entropie, les défauts de mémoire, l'ordre des threads, les entrées imprévisibles telles qu'une source de lumière, etc. Je pense que ma question découle de mon manque de compréhension des algorithmes aléatoires et peut-être J'aurais pu rendre la question plus générique. Je me demande vraiment s'il est possible de créer une fonction qui renvoie des résultats différents avec une entrée identique (y compris toutes les sources d'entropie). On dirait que la réponse est non
ConditionRacer

7

Saviez-vous que les gens travaillent très dur pour s'assurer que, à partir de la même graine, la même séquence de nombres aléatoires soit produite à chaque fois? C'est une propriété souhaitable pour des choses comme la simulation de Monte Carlo, car cela signifie que les résultats sont entièrement reproductibles. Si vous ne spécifiez pas la graine, quelque chose comme l'heure sera utilisée, mais cette reproductibilité exacte est vraiment souhaitée.

Les seuls RNG où cela n'est vraiment pas souhaité sont ceux utilisés pour la cryptographie, et ceux qui y parviennent généralement en utilisant la propre source de nombres aléatoires du système d'exploitation (qui n'est pas rembobinable dans des circonstances normales et qui peut utiliser du matériel de fantaisie) pour fournir leur graine.


Oui, je comprends ce que tu dis. Je n'essaye pas d'implémenter quelque chose de nouveau, c'était juste une curiosité de fin de soirée.
ConditionRacer

1

Je suppose que si vous avez implémenté l'algorithme sur différentes plates-formes matérielles et qu'il a utilisé des techniques telles que la prise des N bits du milieu d'un entier, vous pourriez éventuellement obtenir des réponses différentes si l'encodage entier était différent (gros / petit / milieu de gamme). Vous pouvez également rencontrer des problèmes s'exécutant sur des machines dotées de FPU par rapport à celles qui ne le font pas si vous manipulez des nombres à virgule flottante. Probablement pas un problème sur les ordinateurs de bureau, mais pourrait être un problème sur les téléphones.

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.