2009-07-13 10 views
7

Sto facendo un esercizio di un libro che dice di scrivere un programma che genera numeri psuedorandom. Ho iniziato con semplicità.Qual è il modo giusto per utilizzare la funzione rand() in C++?

#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." << endl; 
    while (cin >> input) 
    cout << randint() << endl; 
    keep_window_open(); 
} 

Ho notato che ogni volta che si eseguiva il programma, 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); 

Il che ha generato lo stesso numero più e più volte (Mi sento stupido ora per la sua attuazione.)

Così ho pensato di essere intelligente e implementare il seme come questo.

srand(rand()); 

Questo fondamentalmente solo fatto lo stesso come il programma ha in primo luogo, ma emesso un diverso insieme di numeri (che ha senso dal primo numero generato da rand() è sempre 41.)

l'unica cosa che mi veniva in mente per rendere questo più casuale è quello di:

  1. Avere l'input dell'utente un numero e set che come il seme (che sarebbe facile da implementare, ma questa è l'ultima risorsa) OR
  2. In qualche modo, il seme deve 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.

risposta

27

opzione 2 non è difficile, qui si va:

srand(time(NULL)); 

è necessario includere stdlib.h per srand() e time.h per time().

+8

+1, questa è la pratica standard. – SingleNegationElimination

+0

Puoi anche leggere in/dev/random se ti trovi in ​​un ambiente * nix; ma sono d'accordo con Token, questa è una pratica standard per impostare srand con la funzione time. – Suroot

+2

Inoltre, chiama srand() in main nella parte superiore poiché si dovrebbe chiamare solo una volta. Non chiamarlo ogni volta che generi un nuovo numero. – MahlerFive

6

È comune seminare il generatore di numeri casuali con l'ora corrente. Prova:

srand (ora (NULL));

8

srand() deve essere utilizzato 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(); 
} 
+0

Mi assicurerò di farlo. – trikker

4

Il problema è che se non si inizializzare il generatore sarà in sé seminare con 0 (come se srand(0) sono stati chiamati). 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 si sta cercando di seminare con un numero casuale utilizzando

srand(rand()); 

siete in effetti fare:

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

Come FigBug mentioned, utilizzando il tempo per inizializzare il generatore è comunemente Usato.

+0

In realtà, il valore iniziale del seme è 1: "Se' rand() 'viene chiamato prima di ogni chiamata a' srand', la stessa sequenza deve essere generata come quando 'srand' viene chiamato per la prima volta con un valore di seme di 1. " http://www.opengroup.org/onlinepubs/000095399/functions/srand.html –

0

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

produrre 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.

Problemi correlati