¿Cuál es la forma correcta de usar la función rand () en C ++?

Estoy haciendo un ejercicio de libro que dice escribir un progtwig que genera números pseudoaleatorios. Empecé simple con.

#include "std_lib_facilities.h" int randint() { int random = 0; random = rand(); return random; } int main() { char input = 0; cout << "Press any character and enter to generate a random number." <> input) cout << randint() << endl; keep_window_open(); } 

Noté que cada vez que se ejecutaba el progtwig, había la misma salida “aleatoria”. Así que busqué en generadores de números aleatorios y decidí intentar sembrar al incluir esto primero en randint ().

  srand(5355); 

Que acaba de generar el mismo número una y otra vez (ahora me siento estúpido por implementarlo).

Así que pensé que sería inteligente e implementaría la semilla así.

 srand(rand()); 

Esto básicamente hizo lo mismo que el progtwig en primer lugar, pero dio como resultado un conjunto diferente de números (lo cual tiene sentido ya que el primer número generado por rand () siempre es 41).

Lo único que se me ocurre para hacer esto más aleatorio es:

  1. Haga que el usuario ingrese un número y establezca eso como la semilla (que sería fácil de implementar, pero este es el último recurso) O
  2. De alguna manera, la semilla debe configurarse para el reloj de la computadora o algún otro número que cambie constantemente.

¿Estoy por encima de mi cabeza y debería parar ahora? ¿Es difícil implementar la opción 2? ¿Alguna otra idea?

Gracias por adelantado.

La opción 2 no es difícil, aquí tienes:

 srand(time(NULL)); 

time.h incluir stdlib.h para srand() y time.h para time() .

srand () solo debe usarse una vez:

 int randint() { int random = rand(); return random; } int main() { // To get a unique sequence the random number generator should only be // seeded once during the life of the application. // As long as you don't try and start the application mulitple times a second // you can use time() to get a ever changing seed point that only repeats every // 60 or so years (assuming 32 bit clock). srand(time(NULL)); // Comment the above line out if you need to debug with deterministic behavior. char input = 0; cout << "Press any character and enter to generate a random number." << endl; while (cin >> input) { cout << randint() << endl; } keep_window_open(); } 

Es común sembrar el generador de números aleatorios con la hora actual. Tratar:

srand (tiempo (NULL));

El problema es que si no siembras el generador, se sembrará con 0 (como si se llamara a srand(0) ). Los PRNG están diseñados para generar la misma secuencia cuando se siembran de la misma forma (debido a que los PNRG no son realmente aleatorios, son algoritmos deterministas y tal vez un poco porque son bastante útiles para las pruebas).

Cuando intentas sembrar con un número aleatorio usando

 srand(rand()); 

estás en efecto haciendo:

 srand(0); x = rand(); // x will always be the same. srand(x); 

Como FigBug mencionó , usar el tiempo para sembrar el generador se usa comúnmente.

Creo que el objective de estos artículos es implementar el algoritmo que está en rand () y no cómo sembrar de manera efectiva.

producir números (pseudo) aleatorios no es trivial y vale la pena investigar diferentes técnicas para generarlos. No creo que el simple hecho de usar rand () sea lo que los autores tenían en mente.