Stessi numeri casuali ogni volta che eseguo il programma

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

io ho

#include  

e sto usando questo per generare numeri casuali

 randomDiceRollComputer = 1 + rand() % 6; 

Devi seminare il tuo generatore di numeri casuali:

Prova a metterlo all’inizio del programma:

 srand ( time(NULL) ); 

Nota che dovrai #include .

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

Devi dare 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  #include  using namespace std; int main() { int r; srand(time(0)); r = rand(); return 0; } 

La funzione rand() è specificatamente richiesta per produrre la stessa sequenza di numeri quando vengono seminati con un dato seme (chiamando srand() ); ogni ansible valore di seme specifica una sequenza. E se non chiami mai srand() , ottieni la stessa sequenza che avresti ottenuto chiamando srand(1) prima di ogni chiamata a rand() .

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

Questo può essere utile a scopo 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 srand(time(NULL)) è il solito modo raccomandato 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, poiché time() (in genere) ha una risoluzione di 1 secondo. E le tipiche implementazioni di `rand () non sono 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 è ansible leggere valori di byte pseudo-casuali di alta qualità. Alcuni sistemi potrebbero avere funzioni come random() , drand48() e così via. E ci sono numerosi algoritmi; Ho sentito cose positive sul 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 delle FAQ di comp.lang.c contiene alcune ottime informazioni sulla generazione di numeri pseudo-casuali.

I generatori di numeri pseudocasuali prendono 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.

Ad ogni modo, il codice che stai cercando, come hanno detto altri, è:

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