C / C++: Generar números aleatorios en un intervalo con rand()

2 comments
A veces es probable que necesitemos generar números aleatorios en un intervalo determinado.

Para ello vamos a hacer uso de la función rand() incluida en la biblioteca / stdlib.h .

#include <cstdlib>

int main(){

  int fin_intervalo = 7;

  int numero = rand() % fin_intervalo;

}

El operador de módulo nos permite generar números en el intervalo [ 0, fin_intervalo - 1 ].

Por tanto sabiendo esto simplemente hay que ajustarlo en función del intervalo que queramos obtener.

El único inconveniente del módulo ( % ) es que no genera números distribuidos uniformemente.

Otro inconveniente es que, al ser siempre la misma semilla ( seed ) siempre que ejecutemos el código vamos a obtener el mismo resultado.

Si queremos solucionarlo tenemos que usar srand( int seed ). En la mayoría de los casos con usar el tiempo del sistema como semilla será suficiente (si no siempre podéis gestionarlo vosotros manualmente ).

Para hacerlo usando el tiempo del sistema usaremos time( NULL ) de la librería

#include <cstdlib>
#include <time.h>

int main(){

  int fin_intervalo = 7;

  // Generamos una semilla
  srand( time( NULL ) );

  int numero = rand() % fin_intervalo;

}



Aquí os dejo mi función para generar un número aleatorio en un intervalo.

#include <iostream>
#include <cstdlib>
#include <ctime>

int RandomNumber( int inicio, int fin ){
/*
Genera un número aleatorio entre
inicio y fin.
*/

int resultado = 0;

// Calculamos el margen entre inicio y fin
int margen = fin - inicio;

// Establecemos el comienzo del intervalo
int comienzo = inicio;

// Comprobamos si el intervalo está al revés
if( inicio > fin ){

// Cambiamos el comienzo
comienzo = fin;

// Cambiamos el signo de la diferencia
margen = margen * -1;
}

/*
* Añadimos uno al margen ya que la función
* rand calcula entre el 0 y uno menos que
* el margen.
*/
margen++;

/*
Si el intervalo no comienza y acaba en el
mismo número.
*/

// Generamos el número aleatorio.
resultado = comienzo + (rand() % margen);

return resultado;
}

int main(){

int inicio;
int fin;

/////// ENTRADA DE DATOS \\\\\\\

std::cout << "Introduce el inicio del rango: ";
std::cin >> inicio;

std::cout << "Introduce el final del rango: ";
std::cin >> fin;

std::cout << std::endl;

/////// SALIDA DE DATOS \\\\\\\

// Inicializamos la semilla
srand( time( NULL ) );

// Calculamos 10 números aleatorios
for(int i = 0; i < 10; i++ ){
std::cout << "Número aleatorio: " << RandomNumber(inicio, fin) << std::endl;
}

}

2 comentarios:

  1. Muy buen programa, te felicito, tuve que modificar algunas cosas porque mi IDE no es compatible con algunas funciones.

    ResponderEliminar
  2. tiempo atras me acuerdo de haber leido de que "ciertos hombres" de norte america trataron de "influenciar a un guru sueco " de ubunto par que la generacion de numeros aleatorios , ocupara una rutina "programada por ellos".
    el asunto es que los procesadores intel tiene dicha rutina incrustada en firmware. en cambio en ubunti es una funcio de su kernel ?mito realidad?

    ResponderEliminar