Proc code - Solutions - RANDOM GENERATOR Go Home

$language

A Pseudo-Random Number Generator


    The below given random service  returns a pseudo-random integer in the range 0 to 999999999 inclusive. It works by creating a list ($RLIST$) of ninety-seven  integers from an initial key (or "seed") and  then partitioning the range into two subranges. The first fifty-five entries are integers to be used in pairs to generate a random result. The next forty-two entries are random results already generated but "on hold" until selected in order to disturb any pattern in output caused by a poor key and to shuffle the order of random integers on output. $P1$ and $P2$ are the pointers for each range. The values referenced by these internal pointers are subtracted and then adjusted to be greater than zero if needed to form a result.

    This table-subtraction method produces a good degree of randomness alone, but another technique is also used to augment its operation. The result stored in $P3$ is used to select one of the 42 entries in locations 56 to 97 in the list for replacement. The number which is being replaced at this location is both promoted up to $P3$ and tagged to be returned from the function as it's return value. The number generated by subtraction in the 1 to 55 range replaces this newly promoted number at its old position where it will wait as a possible random return value until a subtraction selects it. This additional "shuffling" serves to negate any subtle patterns that the sequence of values generated with rotating table subtractions might produce.

    The InitRandom operation takes a seed key in the form of an arbitrary length ASCII string. This key is used to seed the random list used, later, by the Get operation to produce random numbers.  You will notice that the algorithm adds some other values to the seed; this is to prevent poor key initialization.

Analysis

At the heart of this algorithm are two techniques described by Donald Knuth . The algorithm used in this service if fairly fast, operating in constant time while the call to InitRandom will operate in linear time.

The component.

 In the random.trx file you will get :


Generació de números pseude aleatoris

    El servei que es presenta genera números pseude aleatoris en un rang que va des del 0 al 999999999. Treballa a partir d'una llista ($RLIST$) de noranta-set entrades generades a partir d'una clau inicial (llavor) i que la divideix en dues parts. Les primeres cinquanta-cinc entrades s'usen de dos en dos per generar un resultat aleatori. Les següents quaranta-dos són generades aleatòriament però només s'utilitzen per interferir qualsevol comportament no desitjat degut a una clau inicial pobre, generant també aleatòriament el número d'ítem a retornar. $P1$ i $P2$ són els apuntadors a cada rang. Els valors retornats per aquest apuntador es resten i s'ajusten per que sempre siguin valors positius.

    Aquest mètode produeix un bon grau d'aleatorietat, però es fa servir també una altra tècnica per augmentar aquesta operació. El resultat guardat a $P3$ s'usa per seleccionar una de les 42 entrades situades entre les posicions 56 i 97. El número resultant és substituit llavors en $P3$ i seleccioant per retornar-lo com a resultat.

    L'operació InitRandom rep per paràmetres una clau (llavor) que serà una cadena de longitud arbitrària. Aquesta clau s'utilitza per genera la llista pseude aleatòria. Podeu comprovar que a aquesta clau se l'afegeixen alguns valors per prevenir possibles claus pobres.

Anàlisi.

    Aquest algorisme està basat en dues tècniques descrites per Donald Knuth. Malgrat que l'algorisme és prou ràpid, el més interessant es que el seu comportament (complexitat algorísmica) és constant.

El component.

    Al fitxer random.trx trobareu:


Generación de números pseudo aleatorios.

    El servicio que se presenta genera números pseudo aleatorios en un rango de 0 a 999999999 (ambos incluidos). Trabaja a partir de una lista ($RLIST$) de noventa y siete entradas generadas a partir de una clave inicial (o semilla) y la divide en dos partes. Las primeras cincuenta y cinco entradas se usan de dos en dos para generar un resultado aleatorio. Las siguiente cuarenta y dos entradas también son generadas aleatoriamente pero permanecen  estáticas hasta que son seleccionadas con el objetivo de interferir cualquier comportamiento no deseado debido a una pobre clave inicial generando también aleatoriamente el número de item a devolver. $P1$ y $P2$  son los punteros de cada rango. Los valores devueltos por estos apuntadores se restan y ajustan para que siempre sean positivos.

    Este método produce un buen grado de aleatoriedad, pero se emplea otra técnica para aumentar esta operación. El resultado guardado en $P3$ se usa para seleccionar otra de las 42 entradas situadas entre las posiciones 56 y 97. El número resultante es sustituido entonces en $P3$ y seleccionado para devolverlo como resultado.

    La operación InitRandom recibe por parámetros una clave (semilla) que será una cadena de longitud arbitraria. Esta clave se utiliza para generar un lista pseudo aleatoria que posteriormente se utilizará en la operación Get para generar el número aleatorio. Podréis comprobar que a esta clave se le añaden algunos valores para prevenir posibles claves pobres.

Análisis.

    Este algoritmo está basado en dos técnicas descritas por Donald Knuth. Aunque es algoritmo es bastante rápido la parte más interesante es que su comportamiento (complejidad algorítmica) es constante.

El componente.

En el fichero ramdon.trx encontrareis :


Copyright © 1999-2003  $UUU  All rights reserved.
Disclaimer. | Site Comments.