domingo, 14 de noviembre de 2010

Gnerador de Numeros Aleatorios(Extra)

Un Generador de números aleatorios es un componente que crea números o símbolos para un programa en una forma que carezca de un patrón evidente, y que así parezcan ser números aleatorios.

La mayor parte de los generadores de números aleatorios son, en realidad, pseudoaleatorios: se calcula  un valor X0, que se le podría llamar semilla, y, a partir de él, se van generando X1, X2, X3, ... Xn.

Siempre que se parta de la misma semilla, se obtendrá la misma secuencia de valores.
El algoritmo básico es el método congruencial123, que genera valores en el intervalo [0,1), mediante el siguiente esquema:

Se fijan A, B, enteros positivos (deben tener ciertas propiedades para obtener un buen generador), y, a partir de una semilla X0 en el conjunto 0,1,...,(N-1), se generan X1 = A*X0+B (mod N) X2 = A*X1+B (mod N) X3 = A*X2+B (mod N) ... X(k+1) = A*Xk+B (mod N) ...
donde A*X+B (mod N) es el resto de la división entera de A*X+B entre N. Por ejemplo, 16 (mod 7) es 2.

A partir del método congruencial, es posible tomar valores pseudoaleatorios en el intervalo [0,1) como sigue: Se toma N, entero, muy grande, se toman A, B adecuados, y una semilla X0 en 0,1,..,(N-1). A partir de ella, se generan X1,X2,X3,... por el método congruencial, y a partir de ellos, Y0,Y1,Y2,Y3,... mediante la fórmula Yk = Xk /N

El método base es el método congruencial de generación de números en el conjunto
{1,2...,(N-1)}
Para ello, se toman A,B enteros adecuados, se indica un valor inicial (semilla) X0 en el conjunto {1,2,...,(N-1)},  y se aplica el esquema recursivo:
X1=(A.X0+B)ModN, X2=(A.X1+B)modN.
Xk+1=(A.Xk+B)modN:=: donde por XmodN indica el resto de la división entera de X entre N.
Por ejemplo, 12mod7 = 5
Si se conoce cómo generar valores en {1,2,...,(N-1)}, es posible generar valores en el intervalo [0,1), como sigue: Se toma N, muy grande, entero, se toma una semilla X0E {1,2,...,(N-1)}, y se construye la secuencia Y0,Y1,Y2..., obtenida aplicando la expresión Yk = Xk / N

Hay varias formas de generar números aleatorios con las librerías de JAVA 2. Si no se utiliza
el método adecuado, seguramente obtendremos resultados inesperados o mal distribuidos en la generación de números aleatorios.

La libreria java.util.Random está disponible desde la versión 1.2 del SDK. La libreria tiene un método nextInt() que acepta un argumento entero.
public int nextInt(int n)
Dado algún valor mayor o igual cero pero menor que el entero pasado: 0 <= nextInt() < n.
Como muestra, aquí vemos el código que genera un conjunto de números aleatorios e imprime la media:
int count = 1000000;
int range = Integer.MAX_VALUE / 3 * 2;
double sum = 0;
Random rand = new Random();
for (int i=0; i
sum += rand.nextInt(range);
}
System.out.println(sum/count);

Existen métodos más antiguos, como el uso de la función nextInt() sin parámetros y después aplicar el operador abs y %, de la siguiente forma:

Math.abs(rand.nextInt()) % range;

Pero no es un sistema equivalente y tiene varios problemas.

Aqui en lenguaje C

Números aleatorios en C

La generación de números aleatoreos es una de las prácticas mas importantes en cualquier lenguaje de programación, sobre todo cuando deseamos desarrollar juegos, por ejemplo. Para usar números aleatorios en C podemos utilizar la clase Random del nombre espacio System, de la siguiente manera:

1 Random objeto = new Random(); 

2 int numero = objeto.Next();


El método Next de la libreria Random genera y devuelve un número aleatorio entre 0 y la constante Int32.MaxValue (2,147,483,647). El número es generado después complejos procesos matemáticos, y como en casi todos los lenguajes necesitan de una semilla para ser generados, que por defecto es la hora del sistema.

Aún así, muchas veces necesitamos que el número sea generado en un rango específico de valores. Por ejemplo, para una aplicación que simula el lanzamiento de un dado de seis caras necesitamos generar números entre 1 y 6. Para lograr esto, el método Next puede recibir además un entero que indica el rango máximo del número aleatorio. Por ejemplo, el código:

1 Random objeto = new Random(); 

2 int numero = objeto.Next(6);


generaría un número aleatorio entre 0 y 7 (pero no 6), es decir, seis posibles números. Pero, si desearamos algún rango más exacto, podríamos hacer algo como:

1 Random objeto = new Random(); 

2 int numero = objeto.Next(1, 7);


lo que generaría números entre 1 y 7 (pero no 7), de nuevo seis números posibles.

Ejemplo
En el siguiente ejemplo se utilizará la clase Random para generar una serie de números aleatorios cada vez que se presiona un botón:



01 private Random obj = new Random(); 
02 //Método ejecutado al presionar el botón 
03 protected virtual void generar_Click (object sender, System.EventArgs e) 
04 { 
05     etiqueta.Text = ""; 
06     for(int i = 0; i < 4 ; i++) 
07     { 
08         for(int j = 0; j < 4 ; j++) 
09             etiqueta.Text += obj.Next(1, 10) +"\t\t"; 
10         etiqueta.Text += "\n\n"; 
11     } 
12 }

2 comentarios:

  1. Me quede esperando el ejemplo en C compañero, ¿¿¿¿????
    Ya que por la sintaxis veo que es una implementacion en Java??? posiblemente c++.
    Y no olvides poner referencias para consultar dudas al leer las entradad publicadas.
    Suerte

    ResponderEliminar
  2. Muy difícil de leer esta entrada. Y sí, habría que definir en qué lenguaje es el ejemplo y qué librerías requiere (Java no es, tampoco es C). Si llegas a arreglar esta entrada, ponme un correo para calificarla. Tal cual viene ahora no vale puntos.

    ResponderEliminar