Qual è il modo giusto per usare la funzione rand () in C ++?

Sto facendo un esercizio di un libro che dice di scrivere un programma che genera numeri psuedorandom. Ho iniziato con semplicità.

#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(); } 

Ho notato che ogni volta che il programma veniva eseguito, ci sarebbe stata la stessa uscita “casuale“. Così ho esaminato i generatori di numeri casuali e ho deciso di provare a seminare includendo questo primo in randint ().

  srand(5355); 

Che ha generato lo stesso numero ancora e ancora (mi sento stupido ora per averlo implementato).

Quindi pensavo di essere intelligente e di implementare il seme in questo modo.

 srand(rand()); 

Questo in pratica ha fatto esattamente lo stesso del programma, ma ha emesso un diverso numero di numeri (il che ha senso dal momento che il primo numero generato da rand () è sempre 41).

L’unica cosa che potrei pensare per rendere questo più casuale è:

  1. Invita l’utente a inserire un numero e impostalo come seme (che sarebbe facile da implementare, ma questa è l’ultima risorsa) O
  2. In qualche modo, il seme può essere impostato sull’orologio del computer o su un altro numero in costante cambiamento.

Sono sopra la mia testa e dovrei fermarmi ora? L’opzione 2 è difficile da implementare? Altre idee?

Grazie in anticipo.

L’opzione 2 non è difficile, ecco qua:

 srand(time(NULL)); 

dovrai includere stdlib.h per srand() e time.h per time() .

srand () dovrebbe essere usato solo una volta:

 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(); } 

È comune seminare il generatore di numeri casuali con l’ora corrente. Provare:

srand (time (NULL));

Il problema è che se non si effettua il seeding del generatore, esso stesso si semina con 0 (come se srand(0) stato chiamato srand(0) ). I PRNG sono progettati per generare la stessa sequenza quando vengono seminati gli stessi (a causa del fatto che i PNRG non sono realmente casuali, sono algoritmi deterministici e forse un po ‘perché è abbastanza utile per i test).

Quando stai provando a seminarlo con un numero casuale usando

 srand(rand()); 

stai facendo in effetti:

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

Come menzionato da FigBug , si usa comunemente il tempo per seminare il generatore.

Penso che il punto di questi articoli sia quello di implementare l’algoritmo che è in rand () non su come seminare efficacemente.

la produzione di numeri casuali (pseudo) non è banale e vale la pena indagare su diverse tecniche per generarli. Non penso che semplicemente usare rand () sia ciò che gli autori avevano in mente.