2011-10-13 10 views
20

I miei numeri casuali che escono, escono nella stessa sequenza ogni volta che corro il mio gioco. Perché sta succedendo?Stessi numeri casuali ogni volta che eseguo il programma

ho

#include <cstdlib> 

e sto usando questo per generare i numeri casuali

randomDiceRollComputer = 1 + rand() % 6; 
+0

Vedere http://en.wikipedia.org/wiki/Pseudorandom_number_generator – DuckMaestro

risposta

26

È necessario inizializzare il generatore di numeri casuali:

provare a mettere questo all'inizio del programma:

srand (time(NULL)); 

Nota che è necessario il numero #include <ctime>.

L'idea è di seminare l'RNG con un numero diverso ogni volta che si avvia il programma. Usando il tempo come seme, si ottiene un numero diverso ogni volta che si avvia il programma.

+0

Hmm cosa significa esattamente in termini di seeding? – mystycs

+4

Fondamentalmente, gli RNG non sono casuali. Usano una formula che genera numeri casuali apparentemente (pseudo). E come tali hanno bisogno di un "punto di partenza" per iniziare a generare una sequenza. Se non si esegue il seeding, utilizzerà lo stesso seed predefinito e genererà la stessa sequenza ogni volta. – Mysticial

+2

Per risultati migliori, chiama 'rand' una volta dopo' srand' e butta via il valore di ritorno. Risulta che semi simili generano un primo valore simile, ma diverge rapidamente. –

7

È necessario fornire un seme al generatore di numeri randum. Questo può essere fatto prendendo il tempo corrente, in quanto si spera che sia una sorta di casuale.

#include <cstdlib> 
#include <ctime> 
using namespace std; 

int main() 
{ 
    int r; 
    srand(time(0)); 
    r = rand(); 
    return 0; 
} 
0

I generatori di numeri pseudocasuali accettano un numero iniziale o seed e quindi generano il numero successivo nella sequenza da questo. Questo è il motivo per cui sono definiti pseudocasuali, perché se usano sempre lo stesso valore iniziale, genereranno la stessa sequenza di numeri come fa il generatore di lib standard C. Questo può essere risolto dando al generatore un valore iniziale che cambierà la volta successiva che il programma viene eseguito come l'ora corrente.

In ogni caso, il codice che stai cercando altri come ho detto è:

srand(time(0)); //Seed the generator, give it a starting value 
+0

No, they ' Sono chiamati pseudocasuali perché non sono veramente casuali in senso matematico, solo un'approssimazione. Un PRNG che genera numeri distinti ogni volta che viene eseguito è ancora pseudocasuale. –

+0

@KeithThompson Lo so, intendevo che questo è il motivo per cui questo tipo specifico di PRNG è un PRNG. Più in generale un PRNG è noto come pseudocasuale, perché utilizza un algoritmo deterministico per trovare ogni valore della sequenza, corretto? – jgon

1

La funzione rand() sarà espressamente tenuto a produrre la stessa sequenza di numeri quando seminato con un determinato seme (chiamando srand()) ; ogni possibile valore di seme specifica una sequenza. E se non chiami mai srand(), ottieni la stessa sequenza che avresti ottenuto chiamando lo srand(1) prima di qualsiasi chiamata allo rand().

(Questo non si applica trasversalmente diverse implementazioni C++ C o.)

Questo può essere utile per scopi di test. Se c'è un bug nel tuo programma, per esempio, puoi riprodurlo eseguendolo nuovamente con lo stesso seme, garantendo che (escludendo altri comportamenti imprevedibili) otterrai la stessa sequenza di numeri pseudo-casuali.

Chiamare il numero srand(time(NULL)) è il solito metodo consigliato per ottenere numeri pseudo-casuali più o meno imprevedibili. Ma non è perfetto. Se il tuo programma viene eseguito due volte entro lo stesso secondo, probabilmente otterrai la stessa sequenza, perché time() (in genere) ha una risoluzione di 1 secondo. E le implementazioni tipiche di `rand() sono non abbastanza buone per l'uso crittografico; è troppo facile per un utente malintenzionato indovinare quali numeri si otterranno.

Esistono numerose altre implementazioni di numeri casuali. I sistemi Linux hanno due pseudo-dispositivi, /dev/random e /dev/urandom, da cui è possibile leggere valori di byte pseudo-casuali di qualità ragionevole.Alcuni sistemi potrebbero avere funzioni come random(), drand48() e così via. E ci sono numerosi algoritmi; Ho sentito cose positive sullo Mersenne Twister.

Per qualcosa come un gioco, in cui non ti aspetti né ti interessi i giocatori che cercano di imbrogliare, srand(time(NULL)) e rand() è probabilmente abbastanza buono. Per scopi più seri, dovresti ricevere consigli da qualcuno che ne sa più di me.

La sezione 13 dello comp.lang.c FAQ ha alcune informazioni molto buone sulla generazione di numeri pseudo-casuali.

Problemi correlati