Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Ali Baba en 20 Marzo 2018, 03:23 am



Título: ¿Por qué el número que me genera el rand() siempre es el mismo?
Publicado por: Ali Baba en 20 Marzo 2018, 03:23 am
Estoy usando la librería stdlib de c++ para generar un número aleatorio con la función rand() pero resulta que cada vez que compilo me sale 41:

Código
  1. #include <iostream>  
  2. #include <stdlib.h>  
  3. using namespace std;
  4.  
  5. int main() {
  6.  
  7.    int a = rand();
  8.    cout<<a<<endl;
  9.  
  10.    system("pause");
  11.    return 0;
  12. }
  13.  
Estoy aprendiendo C++ ahora y no sé que hago mal.


Título: Re: ¿Por qué el número que me genera el rand() siempre es el mismo?
Publicado por: srWhiteSkull en 20 Marzo 2018, 03:50 am
En primer lugar no existen los números aleatorios en computación sino números pseudoaletorios y estos para generarlos dependen de una semilla, un número.

La forma común es designar el tiempo actual en milisegundos como semilla aleatoria usando la función srand(). Así:

Código:
srand (time(NULL));

Muchos juegos usan esta forma de inicializar la semilla, y si ajustas la hora y la fecha siempre con el mismo valor para empezar un juego podrás observar como los eventos que supuestamente son aleatorios se repiten en el mismo momento.

PD no te olvides de incluir la cabecera time.


Título: Re: ¿Por qué el número que me genera el rand() siempre es el mismo?
Publicado por: Ali Baba en 20 Marzo 2018, 03:55 am
Me dieron una explicación parecida, pero no logro entender esto de inicializar la semila.


Título: Re: ¿Por qué el número que me genera el rand() siempre es el mismo?
Publicado por: srWhiteSkull en 20 Marzo 2018, 03:57 am
Una buena lectura para entenderlo (lee la versión en inglés):
https://en.wikipedia.org/wiki/Random_number_generation


Título: Re: ¿Por qué el número que me genera el rand() siempre es el mismo?
Publicado por: MAFUS en 20 Marzo 2018, 07:09 am
rand funciona así:
Se tiene un número, al que se llama semilla y sobre este número se le aplica una fórmula matemática para modificarlo, y a la vez darnos un entero.

La fórmula siempre es la misma, así que ante una semilla idéntica siempre devuelve el mismo valor. Al iniciar el programa la semilla tiene un valor definido por la librería, así que siempre se inicia con el mismo. Para solucionar esto se proporciona srand, que cambia la semilla al valor que se le pasa como argumento.