web-dev-qa-db-fra.com

Pourquoi la "période d'un (pseudo) générateur de nombres aléatoires" est-il important?

J'ai essayé de comprendre le code de générateur de nombres aléatoires (pseudo) de diverses sources et le concept de la période continue de m'éloigner. Pour satisfaire le niveau minimum de compréhension, j'ai essayé d'en penser en termes de "taille de l'échantillon" des statistiques.

Cependant, je crois que ma compréhension peut être trop simpliste. La documentation que j'ai trouvée pour les fonctions/appels qui permettent (ou nécessitent) une période indiquée que la valeur est importante mais que vous tombez à plat pour expliquer pourquoi ...

où il est possible pour un programmeur de définir la période de générateur de nombres aléatoires (pseudo), ce qui définit une bonne période (optimale ou souhaitable) et pourquoi?

De plus (pour la compréhension ciblée): - Est-ce important (ou utile) de définir la période à l'aide d'un nombre premier? - Une grande période ou une petite période produise-t-elle une production plus souhaitable?

6
Wermske

Les ordinateurs sont non Turing Machines. Ce sont des machines d'état finis déterministe.

Les machines Turing ont une mémoire infinie, les ordinateurs ont une mémoire finie. Les machines de Turing ont des états nombreux (bien que finis), des ordinateurs ne peuvent pas avoir de nombreux États arbitrairement, le nombre d'états différents qu'un ordinateur peut être utilisé est délimité par sa mémoire (un ordinateur avec 1 kibyte de mémoire et 4 registres 8 bits ne peut être que dans 8 * 21024 + 4 * 28 = ~ 10300 états distincts).

Le programme lui-même est également stocké en mémoire, donc elle fait partie de l'État. tout programme qui fonctionne suffisamment longtemps DOIT à un moment donné dans un état dans lequel il était une fois auparavant. Et puisque le programme lui-même fait partie de l'État et des ordinateurs sont déterministes, cela signifie que cela fera exactement la même chose que c'était la dernière fois que c'était dans cet état, il finira donc dans le même état de suivi qu'il a fini par la suite. La dernière fois, ce qui signifie que cela fera maintenant la même chose que ... et ainsi de suite. TOUT Programmes qui fonctionne suffisamment longtemps à un moment donné dans un état, il était auparavant et à partir de ce point sur ce point de la même manière que cela a fait la dernière fois.

Cette longueur d'étapes lorsque le programme commence à se répéter lui-même est appelé période. chaque programme possède un, pas seulement des générateurs de nombres pseudo-aléatoires.

Notez que surtout ces périodes sont théoriques. Même si l'ordinateur de 1 kibyte que j'ai mentionné ci-dessus avait un processeur de 5 THz, cela prendrait toujours 10270 fois l'âge actuel de l'univers pour parcourir 10300 États.

Cependant, la plupart des programmes, et certainement la plupart des PRNG n'utilisent pas la mémoire totale de l'ordinateur uniquement pour leur propre état. (Les PRNG en particulier sont généralement intégrés à des programmes beaucoup plus importants et doivent donc "voler" leur mémoire d'eux.) Plus, les programmes ne font pas de vélo à travers tous les états possibles parfaitement, généralement, ils ne peuvent être que dans un nombre beaucoup plus important d'états . La longueur de la période ne peut jamais être plus longue que le nombre d'états internes et est généralement plus courte. Pour un PRNG mal conçu, c'est voie short.

Le Randu PRNG======== Utilisé sur l'IBM System/360 dans la bibliothèque de sous-routine scientifique et porté à d'autres ordinateurs principaux a été utilisé depuis des décennies dans la recherche, les simulations, les statistiques, etc., et il a (parmi d'autres défauts principaux, par exemple, il ne peut jamais générer des entiers étranges, jamais un même) une période de seulement 229. Ce qui signifie qu'après environ seulement 10 milliards de mesures, vous savez exactement quel numéro va venir ensuite. (Il ne faut que environ 40 Gibyte pour stocker toute la séquence!) Si vous jouez en ligne Black Jack, vous connaissez toutes les cartes qui arrivent, si vous jouez à la roulette en ligne, vous savez quel numéro arrivera ensuite, et ainsi de suite.

Où il est possible pour un programmeur de définir la période pour un générateur de nombres aléatoires (pseudo)

Généralement, ce n'est pas le cas. La longueur de la période est une propriété de l'algorithme. Il existe des algorithmes où vous pouvez choisir la taille de l'état interne, qui influence la longueur de la période.

qu'est-ce qui définit une bonne période (optimale ou souhaitable)

Longue. Plus le mieux est long.

Combien de temps? Eh bien, cyniquement parler: assez longtemps que l'achat suffisamment de disque dur à stocker sera plus cher que d'attaquer une autre partie du système (par exemple, corruption du concanier du Casino's Dataceners de vous laisser installer et installer une porte d'arrière sur le serveur qui vous envoie les cartes du joueur. ).

et pourquoi?

J'espère que c'est évident maintenant. A PRNG avec une petite période (disons 5) donnera au même 5 chiffres encore et encore. Ce n'est pas très "aléatoire".

19
Jörg W Mittag

Les autres réponses fournissent une bonne théorie, mais il est manquant d'une partie de l'application pratique.

Où il est possible pour un programmeur de définir la période pour un générateur de nombres aléatoires (pseudo)

Généralement, cela ne peut pas être défini. Ceci est une propriété de la fonction génératrice. Besoin d'une période différente? Sélectionnez une fonction différente (ou une variation)

qu'est-ce qui définit une bonne période (optimale ou souhaitable) et pourquoi?

Généralement, une période devrait être aussi longue que possible. Un vrai RNG qui utilise une entropie du monde réel n'a pas de période, ce qui est idéal pour certaines applications.

Plus la période est longue, moins avant de se répète. Si A PRNG se répète au mauvais moment, il pourrait se manifester comme une anomalie visible par l'utilisateur (par exemple, un jeu de cartes qui traite avec le même ordre de pont). Parfois, c'est souhaitable: par exemple: par exemple, un pourrait donner une graine Minecraft à quelqu'un d'autre pour vérifier le même monde généré (techniquement presque-la même dans le cas de Minecraft, comme les points de réponse acceptés). Parfois, ce n'est pas le cas: les applications cryptographiques sont particulièrement sensible aux PRNG qui se répètent, c'est pourquoi ils ont tendance à inclure également l'entropie .

Les PRNG sont nécessairement liés par la taille de la variable utilisée pour contenir son état interne: comme la réponse acceptée indique, l'état actuel du PRNG définit son prochain état. C'est essentiellement un automate d'état fini. où vous pouvez (généralement) choisir votre état initial (graine) et Les états sont une grande boucle. Utilisation du principe du pigeonhole On peut prouver que si l'état interne est par exemple 32 bits, la période du PRNG a une limite supérieure de 232 états uniques. Notez que la période réelle sera probablement inférieure: l'état définit simplement la limite supérieure théorique.

En réalité, il est possible et de plus en plus commun, d'augmenter la période effective ou de réduire les dommages potentiels réalisés lorsque la période se répète en utilisant ces méthodes:

  • Utilisez un état interne plus grand que celui requis par l'utilisateur du PRNG et ne renvoyez qu'une seule partie du numéro. Par exemple: Si des entiers 32 bits sont nécessaires, utilisez 64 bits d'état en interne et simplement renvoyer le 32 bits inférieurs de chaque numéro. Le même entier 32 bits peut être retourné plusieurs fois. Toutefois, le numéro suivant est-il peu probable qu'il soit identique car le réel L'état interne est différent. Par exemple:

    État interne: 0100 0110 Retour 0110.

    État interne: 0011 0110 renvoie également 0110.

    Cela fait partie de la stratégie utilisée par le Mersenne Twister qui a une longue période (bien qu'il ait certains inconvénients à prendre en compte).

  • Utilisez plusieurs valeurs pour générer un numéro unique. Il s'agit d'une stratégie utilisée par certains générateurs "réels" basés sur l'entropie pour "normaliser" les données. Par exemple: étant donné un flux de chiffres binaires, supprimez des paires différentes et n'utilisez que des chiffres consécutifs correspondant.

    10 01 11 00 10 00 01 11 devient 11 00 00 11 et comme les chiffres sont combinés, donnant au quad 1001.

    Selon les données extraites, cela peut modifier la signification d'une valeur tel qu'il est réutilisé à mesure que la période se répète, ce qui le rend efficace quelque chose de différent. Ceci est moins utile pour les PRNG que les RNG basés sur l'entropie, mais il est toujours possible de traiter l'état comme un flux de bits. Cela peut rendre la période effective plus grande en fonction de la stratégie utilisée et des données récupérées.

  • Si la même valeur est traitée différemment lorsque celle-ci se répète, elle peut masquer le fait que la période répétée. Ceci est similaire à la façon dont Java Java.util.Random classe travaille. Si une valeur est extraite en tant qu'entreger 64 bits la première fois et un entier 32 bits la prochaine fois, personne ne le saura peut-être réellement répété. Exemples de comment faire de ce travail en supposant un état interne 64 bits:

    • Si un entier 64 bits est demandé, renvoyez simplement l'état interne.
    • Si un entier plus court est demandé, masquez quelques-uns des bits ou de les combiner. Peut-être une valeur de 32 bits pourrait XOR les deux moitiés de la valeur 64 bits ensemble.
    • Si un booléen est demandé, appliquez une technique pour utiliser tous les bits pour déterminer la valeur (par exemple, le nombre de bits de bits est faux, impair est vrai).
    • Les valeurs de point flottant peuvent être plus difficiles à cause de IEEE 754 contraintes sur le motif de bits, mais il existe des moyens d'utiliser des bits aléatoires pour obtenir des valeurs aléatoires.
  • Si une valeur délimitée (par exemple me donne un entier de 1 à 100) est nécessaire, cela facilite la tâche. Une simple opération de modulo peut introduire des biais, mais on peut appliquer des techniques pour utiliser plus de bits pour distribuer la valeur uniformément. Le même état utilisé deux fois mais distribué contre différents intervalles rendra probablement des nombres différents.

  • Inclure l'entropie lors du retour d'une valeur. Gardez le même état interne, mais peut-être le combiner avec des données binaires représentant quelque chose de non déterministe tel que la température interne de la CPU de l'ordinateur à de nombreuses décimales lors de la validation d'une valeur du PRNG. Peut-être faire la même chose mais avec l'horloge interne plus précise qui mesure des tiques de processeur individuelles. Ceci est sur le bord de ce que A PRNG est techniquement, il s'agit d'une approche hybride, mais des tactiques similaires sont utilisées pour semer les PRNG en premier lieu.

1
user22815

Prenez votre programme préféré en utilisant un PRNG.

Ensuite, imaginez ce qui se passerait si la période de l'PRNG devient très petite (par ex. 100).

Bien sûr, cela dépend du programme, mais si vous utilisez le faible PRNG pour cryptage, un attaquant pourrait facilement remarquer la périodicité et éventuellement pouvoir déchiffrer des messages secrets. Si vous utilisez la faiblesse PRNG pour la simulation de Monte Carlo, exécutez votre simulation pendant une longue période ne vous apprend que rien de plus que de le gérer pendant une courte période, etc.

Je ne suis pas un expert PRNG, mais Afaik, la période n'est généralement pas un paramètre accordable. Cependant, vous pouvez choisir votre PRNG, et certains PRNG donner (dans leur documentation) certaines promesses (ou attentes) sur leurs règles. Habituellement, un PRNG avec une période plus longue a un état plus grand, de plus en plus lentement. Donc, vous avez un compromis à faire.

1
Basile Starynkevitch