PocketMagic

PocketMagic

Donde Tecnología encuentra magia

Fuente RSS de PocketMagic
 

Generador de número Pseudoarbitrario lineal (PRNG)

Por Radu Motisan Fijado el 17 de enero de 2010

Entrada

Muy a menudo tenemos que generar números arbitrarios con objetivos diferentes en los límites de juegos simples a algoritmos de codificación de avances.
Muchos C/C ++ los programadores son bien usados con el srand () / rand () las funciones, pero simplemente la utilización de un código predefinido para conseguir las tareas dadas, no son a veces bastante.
Totalmente el entendimiento cual un número arbitrario es, como puede ser generado, ayuda a la adquisición de la mejor solución.

Comenzando con mis primeros años universitarios, usé un generador pseudoarbitrario lineal, fácil a poner en práctica, y completamente útil en muchas aplicaciones.
Un pseudogenerador de número arbitrario (PRNG) es un algoritmo para generar una secuencia de números que se acerca las propiedades de números arbitrarios. La secuencia no es realmente arbitraria en esto es completamente determinada por un relativamente pequeño juego de valores iniciales, llamados el estado del PRNG. Lea más aquí. Read more here.

Un enfoque simple

Vaya a considerar a, b y c tres número entero constante. Planeamos generar un juego de pseudonúmeros arbitrarios X0, X1..., Xn. Asumiendo X0 = d, el resto de los números puede ser calculado en una utilización recurrente de la fórmula: Assuming X0 = d, the rest of the numbers can be computed in a recurrent using the formula:
Xn+1 = (a*Xn + b) % c.

a, b, c y d son los valores iniciales, también conocidos como el estado del PRNG.

el c limita los valores que resultan con el intervalo 0.. c-1
a y b afectan el ángulo lineal.

Aquí está un algoritmo C simple para ilustrar mejor la fórmula:

#include

intervalo principal ()
{
intervalo a=71, b=19, c=256, d = 3;

intervalo x [200], yo = 0;
x [0] = d;
para (i=1; yo<200;i++)
x [yo] = (a*x [i-1] + b) % c;

printf ("Los números arbitrarios pseudo are:\n");
para (i=0; yo<200;i++)
printf (" %d", x [yo]);

vuelva 1;
}

Usted puede ver el resultado a la imagen siguiente:
pnrg1
Código fuente here:pnrg1.

Parecerse al srand () y rand () funciona usted está todo acostumbrado para, tengo que destacar esto ellos también usan un PRNG. srand () "siembra" el generador arbitrario y prácticamente todo que hace debe poner los valores iniciales (el estado del PRNG).
Usted puede adaptar fácilmente el generador encima para trabajar como srand () y rand ():

#include

intervalo un = 71, b = 19, d = 0;

vacío mysrand (semilla internacional)
{
d = semilla;
}

intervalo myrand (umbral internacional)
{
intervalo x = d;
x = (a*x + b) umbral de %;
d = x;//avanzan con cada llamada a la función
devuelva x;
}

vacío principal ()
{
mysrand (122);
printf ("Pseudonúmero arbitrario: %d\n", myrand (256));
printf ("Pseudonúmero arbitrario: %d\n", myrand (256));

}

Resultado como imaginado abajo:
pnrg2
El código fuente aquí: pnrg2

Usted notará rápidamente que el PRNG produce la misma salida cada vez usted inicializa el mysrand con el mismo valor:
mysrand (122)-> myrand (256) =233
Pero esto es el mismo en caso del incorporado srand () y rand () función también. La razón consiste en que no tenemos una fuente buena para el caos. Usted puede vencer esto usando: You can overcome this by using:
mysrand (GetTickCount);
o
mysrand (Cursorpos.x)
o
mysrand (FreeRAMMemory)
o
mysrand (UserLastKeyPressed)
o etc., uniendo la función de inicialización a un acontecimiento arbitrario.

Análisis adicional

Hablando del nivel de caos de este generador, hay un modo simple de analizar una secuencia de números, en nuestro caso el X0..., Xn serie outputed por PRNG lineal.
1. En un espacio dimensionado solo, representado por el eje de número real y el juego correspondiente de todos los números reales (R), un número dado puede ser visto como una entidad sola correspondiente a un punto en el eje.
Para eg., ver el cuadro siguiente:
pnrg3
Esto representa unos números reales en el eje. Uno podría preguntar, lo que es el sentido del número-1.13. La respuesta simple es:-1.13 es la entidad que se sienta en el eje en la posición dada. Varias propiedades pueden ser extrapoladas, y conseguimos un sentido de lo que-1.13 es, y lo más importante: lo que puede nosotros hacer con ello. 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. Para un par dado de números, podemos la imagen un espacio bidimensional, donde el par representa un punto en un sistema Cartesiano de la referencia. El par recibe un sentido, y podemos explicarnos adelante esto, usando al par con varios objetivos.

De un modo similar, para un juego dado de números (x0, x1..., xn) que parecen arbitrarios y sin sentido al principio, van no olvidan que en un espacio n-dimensional, el juego de números tiene un sentido muy simple y claro: esto representa un punto.

Por suerte, para el PRNG's las cosas son más simples.
Considerando un juego de números generados con PRNG lineal, ellos pueden ser representados sin cualquier sentido en una dimensión: ellos serían puntos "arbitrarios" en el eje de número.
PERO, podemos buscar un "camino" o un "sentido" moviéndonos a un espacio superior, en este caso a dos dimensiones, y representando los números pseudo establecidos por el punto de coordenadas (Xn-1, Xn).

Ver la muestra siguiente:
1-La primera muestra PRNG he fijado, he producido los números siguientes:
3 83 24 72 11 32243120 91 80 67168.... etc.
Es muy difícil entender lo que estos números significan o dar un objetivo a esta secuencia o hasta entender el modelo que sirvió para producirlos.

2-Van a escribir un programa simple para ilustrar gráficamente en dos pares de dimensiones de números (Xn, Xn+1) como puntos en un sistema Cartesiano.
Generador de número arbitrario Pseudo lineal
Los puntos en el cuadro no son nada más entonces los 200 números arbitrarios 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 manera interesante, lo que en el primer pareció el caos total, ahora recuerda al pedido apropiado de un huerto con árboles correctamente plantados en filas y columnas, en un ángulo dado, a nuestra imagen representada por los puntos negros.
Consiga el código fuente aquí: pnrg3gui

Si la inspección de la secuencia en dos dimensiones no muestra nada útil, podemos movernos adelante y comprobar la representación en tres dimensiones, puntos de coordenadas (Xn-1, Xn, Xn+1), etcétera.

Como mostrado encima, a un nivel dado, el contenido "arbitrario" conseguirá un sentido.

Esperanza esto ayuda,
Radu

Por Radu Motisan

Deje una Respuesta

Por favor copie la cuerda W9pS4h al campo abajo:

Opciones de blog

Traductor

English flagFrench flagGerman flagItalian flagPortuguese flagRussian flagSpanish flag
By N2H

Categorías

Archivos

Etiquetas

Enlaces patrocinados

¡Suscríbase!

Consiga a más seguidores

Nuestros Patrocinadores