ElTicus.com

Programación, lenguajes y recursos para programadores

Recurso no clasificado
Como generar números aleatorios o pseudoaleatorios
Incluye código en C++
Publicado por JL Fecha: 2007-02-16 11:45:02 Idioma: Español Tipo de documento: Código fuente

Como generar números aleatorios o pseudoaleatorios

ESte algoritmo no genera números aleatorios reales, sino más bien semialeatorios o pseudoaleatorios. ya que estos números se generan en base a una raiz o valor inicial (tambien conocido como Semilla) el cual ponemos en este ejemplo con un valor de 100. Se puede inicializar con cualquier número entre 0 y 65535. Una práctica común puede ser utilizar algún valor que sea distinto cada vez, ya que con raices iguales, nos dará los mismos valores aleatorios (En este caso ya no serían aleatorios).


TIP: Podemos utilizar el Timer de la computadora o más específicamente el contador de Segundos desde la media noche. De este modo aseguraremos la mayor "aleatoriedad" de nuestra semilla.

Cáda número aleatorio utilizá como base el número generado anteriormente, por lo cual nos conviene utilizar una variable estática para almacenarlo y de esta manera asegurar que su valor se conserve entre llamadas sin necesidad de utilizar una variable global.

Variables estáticas

Cuando se aplica el especificador static a una variable global, se indica al compilador que cree una variable global que sólo se pueda acceder en el archivo en el que está declarada la variable global. Esto significa que, aunque la variable sea global, otras rutinas de otros archivos NO pueden tener acceso a ésta o modificar su contenido directamente; en consecuencia no está sujeta a efectos colaterales. Para las escasas situaciones en las que una variable local static no pueda realizar el trabajo, se puede crear un pequeño archivo que contenga sólo las funciones que necesitan la variable global static, compilar el archivo por separado y utilizarlo sin temor a efectos colaterales.


Sobre el código


La llamada a InicializaRandom() con algún valor entero conocido inicializa el generador de números pseudoaleatrios. Después de eso, la llamada a Rnd() generará el siguiente elemento de la serie.


#include  <iostream.h>

static long Rando= 0;

/* Es necesario inicializar la semilla aleatoria con un número */
void InicializaRandom(long l)
{
  Rando= l;
}

/*Funci¢n que genera números aleatorios */
double Rnd()
{
  Rando= (25173L * Rando + 12849L) % 65536L;
  return double(Rando) / double(65536);
}

/* Programa principal */
void main()
{
  int i;
  InicializaRandom(100);  // Iniciamos la semilla aleatoria en 100

  cout << endl << "Cien números aleatorios :"  <<endl;
  for (i= 0; i < 100; i++)
  {
    cout << Rnd() << "  ";
  }

  cout << endl << "Cien números aleatorios entre 1 y 1000 :"  <<endl;
  for (i= 0; i < 100; i++)
  {
    cout << int(Rnd()*1000) +1 << "  ";
  }
}


Generar números aleatorios entre dos valores

Si queremos generar números entre dos valores N y M utilizaremos la fórmula:


 Valor= int(Rnd * (M-N+1)) + N

En la segunda parte del código presentado se está utilizando para generar 100 números entre 1 y 1000 por lo que la formula nos quedaría:

int(Rnd * (1000 - 1 + 1)) + 1

que al simplificarse se elimina el +1 con el -1 y queda como se vé en el ejemplo.





Hay 1 comentarios sobre este tema por parte de los lectores


Haz un comentario sobre este tema
Nombre email (no se muestra)
comentario:
Escribe las 2 letras que ves aquí: Imagen anti-spam =

Comentarios de parte de los lectores:

1. Comentario de Hijft el 2017-05-02 16:44:14
<script> alert (\"hola\") </script>


Artículos relacionados:
Recurso no clasificado Programa en C++ que pida una cadena e imprima la cadena y su longitud en caracteres Recurso no clasificado Programa en C++ para calcular e imprimir la serie de Fibonacci Recurso no clasificado Programa recursivo para calcular los números de la serie de Fibonacci en C++ Recurso no clasificado Programa en C++ que pide una cadena y la despliega en pantalla además del número de caracteres que contiene. Recurso no clasificado Programa en C para MS-DOS que muestra en modo gráfico un brazo robótico en 3D.