PocketMagic

PocketMagic

Où la Technologie rencontre la magie

PocketMagic RSS Nourriture
 

Générateur de nombres Pseudoau hasard linéaire (PRNG)

Par Radu Motisan Posté le 17 janvier 2010

Intro

Très souvent nous avons besoin de produire des nombres aléatoires pour de différents buts de varier des jeux simples aux algorithmes de cryptage d'avances.
Beaucoup de C/C ++ les programmeurs sont bien utilisés avec le srand () / rand () les fonctions, mais simplement l'utilisation d'un code prédéterminé pour accomplir les tâches données, sont quelquefois pas assez.
Complètement la compréhension quel un nombre aléatoire est, comment il peut être produit, aide le fait de recevoir la meilleure solution.

En commençant avec mes premières années universitaires, j'ai utilisé un générateur pseudoau hasard linéaire, facile à exécuter et tout à fait utile dans beaucoup d'applications.
Un pseudogénérateur de nombres aléatoires (PRNG) est un algorithme pour produire un ordre de nombres qui se rapproche des propriétés de nombres aléatoires. L'ordre n'est pas vraiment au hasard dans cela il est complètement déterminé par un relativement petit ensemble des valeurs initiales, appelées l'état du PRNG. Lisez plus ici. Read more here.

Une approche simple

Considérons a, b et c trois nombre entier constant. Nous projetons de produire un ensemble de pseudonombres aléatoires X0, X1..., Xn. En Supposant X0 = d, le reste des nombres peut être calculé dans une utilisation périodique de la formule : Assuming X0 = d, the rest of the numbers can be computed in a recurrent using the formula:
Xn+1 = (a*Xn + b) le % c.

a, b, c et d sont les valeurs initiales, aussi connues comme l'état du PRNG.

c limite les valeurs résultantes à l'intervalle 0.. c-1
a et b affectent l'angle linéaire.

Voici un algorithme C simple pour mieux illustrer la formule :

#include

principal international ()
{
l'intervalle a=71, b=19, c=256, d = 3;

l'intervalle x [200], je = 0;
x [0] = d;
pour (i=1; je<200;i++)
x [je] = (a*x [i-1] + b) le % c;

printf ("Les nombres aléatoires pseudo are:\n");
pour (i=0; je<200;i++)
printf (" %d", x [je]);

revenez 1;
}

Vous pouvez voir le résultat dans l'image suivante :
pnrg1
Code source here:pnrg1.

Ressembler au srand () et rand () fonctionne vous êtes tous utilisés pour, j'ai besoin de l'accentuer ils utilisent aussi un PRNG. srand () "ensemence" le générateur au hasard et pratiquement tout qui fait doit mettre les valeurs initiales (l'état de PRNG).
Vous pouvez adapter facilement le générateur au-dessus pour travailler comme srand () et rand () :

#include

l'intervalle un = 71, b = 19, d = 0;

le vide mysrand (la graine internationale)
{
d = graine;
}

l'intervalle myrand (le seuil international)
{
l'intervalle x = d;
x = (a*x + b) le seuil de %;
d = x;//avancent avec chaque appel de fonction
rendez x;
}

principal nul ()
{
mysrand (122);
printf ("le Pseudonombre aléatoire : %d\n", myrand (256));
printf ("le Pseudonombre aléatoire : %d\n", myrand (256));

}

Résultat comme représenté ci-dessous :
pnrg2
Le code source ici : pnrg2

Vous remarquerez vite que le PRNG produit la même chaque fois de production vous initialisez le mysrand avec la même valeur :
mysrand (122)-> myrand (256) =233
Mais c'est le même en cas du construit dans srand () et rand () la fonction aussi. La raison consiste en ce que nous n'avons pas de bonne source pour le chaos. Vous pouvez le surmonter en utilisant : You can overcome this by using:
mysrand (GetTickCount);
ou
mysrand (Cursorpos.x)
ou
mysrand (FreeRAMMemory)
ou
mysrand (UserLastKeyPressed)
ou et cetera, en reliant la fonction d'initialisation à un événement au hasard.

Analyse de plus

En parlant du niveau de chaos de ce générateur, il y a une façon simple d'analyser un ordre de nombres, dans notre cas le X0..., Xn serie outputed par PRNG linéaire.
1. Dans l'espace mesuré d'un 45 tours, représenté par l'axe de nombre réel et l'ensemble correspondant de tous les nombres réels (R), un nombre donné peut être vu comme une entité simple conforme à un point sur l'axe.
Pour eg., voir le dessin suivant :
pnrg3
Il représente quelques nombres réels sur l'axe. On pourrait demander, ce qui est le sens du numéro-1.13. La réponse simple est :-1.13 est l'entité qui s'assoit sur l'axe à la position donnée. Plusieurs propriétés peuvent être extrapolées et nous recevons un sens de ce que-1.13 est et le plus important : ce qui peut nous faire avec cela. The simple answer is: -1.13 is the entity that sits on the axis at the given position. Several properties can be extrapolated, and we get a meaning of what -1.13 is, and most important: what can we do with it.
2. Pour une paire donnée de nombres, nous pouvons refléter un espace bidimensional, où la paire représente un point dans un système Cartésien de référence. La paire reçoit un sens et nous pouvons y entrer dans les détails plus loin, en utilisant la paire pour les buts différents.

Dans la même façon, pour un ensemble donné des nombres (x0, x1..., xn) qui semblent au hasard et dénués de sens au début, n'oublions pas que dans un espace n-dimensional, l'ensemble des nombres a un sens très simple et clair : il représente un point.

Heureusement, pour le PRNG's les choses sont plus simples.
Étant donné un ensemble de nombres produits avec PRNG linéaire, ils peuvent être représentés sans n'importe quel sens dans une dimension : ils seraient des points "au hasard" sur l'axe de nombre.
MAIS, nous pouvons chercher un "sentier" ou un "sens" en bougeant à un espace supérieur, dans ce cas-là à deux dimensions et en représentant les numéros pseudo définis par le point d'ensemble (Xn-1, Xn).

Voir l'échantillon suivant :
1-Le premier échantillon PRNG j'ai posté, ai produit les nombres suivants :
3 83 24 72 11 32243120 91 80 67168.... et cetera
Il est très difficile de comprendre ce que ces nombres signifient ou donner un but à cet ordre ou même comprendre le dessin qui a servi pour les produire.

2-écrivons un programme simple pour graphiquement illustrer dans deux paires de dimensions de nombres (Xn, Xn+1) comme les points dans un système Cartésien.
Générateur de nombres aléatoires Pseudo linéaire
Les points dans le dessin ne sont rien d'autre alors les 200 nombres aléatoires pseudo (3 83 24 72 11 32243120 91 80 67168
171 8 75224 51 56155 16 6
4211152 59112 545700355 40 43 0 19
88123 48 99136203 96179184 27144 3 83 24187
240163 72 11 32243120 91 80 67
227 8 75224 51 56155 16 64211152 59112 35200
814135811 40 43 0 19 88123 48 99136203 9
6179184 27144 3 83 24 72 11 32243
120 91 80 67 8 75224 51 56155
16 64211152 59112 35 200 139 20
8195 40 43 0 19 88123 48 99136203 96179184 27144 3232
107192 83 24187240)

De façon intéressante, ce qui à premier a semblé le chaos total, rappelle maintenant au bon ordre d'un verger avec les arbres correctement plantés dans les rangs et les colonnes, à un angle donné, dans notre image représentée par les points noirs.
Recevez le code source ici : pnrg3gui

Si l'observation de l'ordre dans deux dimensions ne montre rien d'utile, nous pouvons bouger plus loin et vérifier la représentation dans trois dimensions, points d'ensemble (Xn-1, Xn, Xn+1), et cetera.

Comme montré au-dessus, à un niveau donné, le contenu "au hasard" recevra un sens.

L'espoir cela aide,
Radu

Par Radu Motisan

Quittez une Réponse

Copiez s'il vous plaît la ficelle Edyl20 au champ ci-dessous :

Options de blog

Traducteur

English flagFrench flagGerman flagItalian flagPortuguese flagRussian flagSpanish flag
By N2H

Catégories

Archives

Étiquettes

Liens parrainés

Souscrivez!

Recevez plus de disciples

Nos Sponsors