2011-02-07 21 views
17

È possibile generare un numero casuale diverso, ogni volta che viene eseguito il ciclo. Ad esempio, ho:Come generare numeri casuali diversi in un ciclo in C++?

for (int t=0;t<10;t++) 
{ 
    int random_x; 
    srand (time(NULL)); 
    random_x = rand() % 100; 
    cout<<"\nRandom X = "<<random_x; 
} 

Ma il problema è che genera sempre lo stesso numero casuale. È possibile generare numeri casuali diversi ogni volta che si esegue il ciclo?

Esiste la possibilità di reimpostare anche l'inizializzazione del numero casuale?

+3

Leggere la documentazione per 'srand()' potrebbe essere utile. –

+1

Solo per rendere più utile il commento di Noah: http://www.cplusplus.com/reference/clibrary/cstdlib/srand/ :) –

+1

possibile duplicato di [Numeri sempre ripetuti dati da rand()] (http: // stackoverflow.com/questions/4859089/always-repeated-numbers-given-by-rand) –

risposta

22

Non utilizzare srand all'interno del ciclo, utilizzarlo solo una volta, ad es. all'inizio di main(). E srand() è esattamente come resettare questo.

+0

Ho fatto questo, ma cambia il valore casuale solo una volta ora. Come per esempio genera 15, 23, 23, 23, 23. Ora cosa devo fare? – bijlikamasla

+6

Se lo metti davvero all'inizio di main(), non otterrai questa sequenza – etarion

+1

Tuttavia, se si esegue il programma più di una volta con in secondi, la sequenza di numeri casuali sarà la stessa –

16

Ogni volta ricevi lo stesso numero casuale, perché stai impostando un seme all'interno del ciclo. Anche se stai usando time(), cambia solo una volta al secondo, quindi se il ciclo si completa in un secondo (che probabilmente lo farà), otterrai lo stesso valore di seme ogni volta e lo stesso numero casuale iniziale.

Spostare la chiamata srand() fuori dal ciclo (e chiamarla una sola volta, all'inizio della app) e si dovrebbero ottenere numeri casuali "casuali".

+3

Spostarlo fuori dal ciclo potrebbe non essere sufficiente, poiché il ciclo potrebbe essere chiamato più di una volta al secondo. –

+2

Oh, buon punto - chiarito. – payne

+0

Ho fatto questo, ma cambia il valore casuale solo una volta ora. Ad esempio, genera 15, 23, 23, 23, 23. Ora cosa devo fare? – bijlikamasla

0

Interrompere la semina del generatore ogni volta. Estrarre la chiamata srand dal ciclo

+0

Ho fatto questo , ma cambia il valore casuale solo una volta ora. Come per esempio genera 15, 23, 23, 23, 23. Ora cosa devo fare? – bijlikamasla

+1

Hai davvero bisogno di scrivere lo stesso commento su ogni risposta? –

3

Provare a spostare il seme srand di fuori del ciclo in questo modo:

srand (time(NULL)); 
for (int t=0;t<10;t++) 
{ 
    int random_x; 
    random_x = rand() % 100; 
    cout<< "\nRandom X = "<<random_x; 
} 

Come Mark Ransom dice nel commento, spostando il seme di fuori del ciclo solo aiutare se il ciclo non è residente in una funzione sei chiamando più volte.

+0

Lo spostamento all'esterno del ciclo potrebbe non essere sufficiente, poiché il ciclo potrebbe essere chiamato più di una volta al secondo. –

+0

Ho fatto questo, ma cambia il valore casuale solo una volta ora. Ad esempio, genera 15, 23, 23, 23, 23. Ora cosa devo fare? – bijlikamasla

0

Spostare la chiamata srand all'inizio del programma. Come lo hai ora, il tempo potrebbe essere lo stesso tra due chiamate consecutive, quindi il generatore di numeri casuali ricomincerà nello stesso punto.

+0

Ho fatto questo, ma cambia il valore casuale solo una volta ora. Ad esempio, genera 15, 23, 23, 23, 23. Ora cosa devo fare? – bijlikamasla

0

È necessario estrarre l'inizializzazione di time() dal ciclo for.

Ecco un esempio che verrà emesso nel numero casuale previsto dalla console di windows (ahah).

#include <iostream> 
#include <windows.h> 
#include "time.h" 
int main(int argc, char*argv[]) 
{ 
    srand (time(NULL)); 
    for (int t = 0; t < 10; t++) 
    { 
     int random_x; 

     random_x = rand() % 100; 
     std::cout << "\nRandom X = " << random_x << std::endl; 
    } 
    Sleep(50000); 
    return 0; 
} 
+0

dice che l'identificatore del sonno non è stato trovato – bijlikamasla

+0

Hai inserito windows.h? Questo pezzo di codice funziona perfettamente con VS2008. –

+0

Ho usato questo, ma dice "L'applicazione ha richiesto il tempo di esecuzione per terminarlo in modo insolito – bijlikamasla

0

La funzione tempo restituisce probabilmente lo stesso valore durante ciascuna iterazione del ciclo.

Provare a inizializzare il seme casuale prima del ciclo.

+0

Ho fatto questo, ma cambia valore aleatorio solo una volta ora Come per esempio genera 15, 23, 23, 23, 23. Ora cosa devo fare? – bijlikamasla

0

Ogni iterazione si sta reimpostando la sequenza di numeri pseudocasuali perché si sta chiamando srand con lo stesso seme (poiché la chiamata a time è così frequente). Utilizzare un seme diverso o chiamare sranduna volta prima di entrare nel ciclo.

+0

Ho fatto questo, ma cambia il valore casuale solo una volta ora. Come per esempio genera 15, 23, 23, 23, 23. Ora cosa devo fare? – bijlikamasla

+1

Sì, possiamo leggere. L'hai pubblicato in 5 luoghi diversi. – Marlon

-1

Non conosco gli uomini. Ho trovato il modo migliore per me dopo aver provato diversi modi come 10 minuti. (Modificare i numeri di codice per ottenere numeri casuali grande o piccolo.)

int x; 
srand (time(NULL)); 
x = rand() % 1000 * rand() % 10000 ; 
cout<<x; 
1

Ho avuto questo stesso problema per giorni. Mantenere srand() fuori dal ciclo è un +. Inoltre, non assegnare rand()% 100 a nessuna variabile.Semplicemente cout rand()% 100 nel ciclo. Prova questo:

srand (time(NULL)); 
    (int t=0;t<10;t++) 
    { 
    cout << rand() % 100 << endl; 
    } 
0

Se si dispone di randoms nella fase iniziale del programma si potrebbe moltiplicare la variabile di ciclo per il momento - di dare una migliore distribuzione. Per esempio

for (int t = 0; t < 10; t++){ 
     srand(time(NULL)*t); 
     random = rand() % GetScreenWidth(); 

} 
7

fare non uso rand(); utilizzare le nuove strutture C++ 11 (ad esempio std::mt19937, std::uniform_int_distribution, ecc.).

È possibile utilizzare il codice come questo (live here on Ideone):

#include <iostream> 
#include <random> 
using namespace std; 

int main() 
{ 
    // Random seed 
    random_device rd; 

    // Initialize Mersenne Twister pseudo-random number generator 
    mt19937 gen(rd()); 

    // Generate pseudo-random numbers 
    // uniformly distributed in range (1, 100) 
    uniform_int_distribution<> dis(1, 100); 

    // Generate ten pseudo-random numbers 
    for (int i = 0; i < 10; i++) 
    { 
     int randomX = dis(gen); 
     cout << "\nRandom X = " << randomX; 
    } 
} 

P.S.

Considerate guardare questo video da Going Native 2013 conferenza per maggiori dettagli su rand() problemi -related:

rand() Considered Harmful

0
/*this code is written in Turbo C++ 
For Visual Studio, code is in comment*/ 

int a[10],ct=0,x=10,y=10; //x,y can be any value, but within the range of 
          //array declared 
randomize();     //there is no need to use this Visual Studio 
for(int i=0;i<10;i++) 
{ a[i]=random(10);   //use a[i]=rand()%10 for Visual Studio 
} 
cout<<"\n\n"; 
do 
{ ct=0; 
    for(i=0;i<x;i++) 
    { for(int j=0;j<y;j++) 
     { if(a[i]==a[j]&&i!=j) 
      { a[j]=random(10); //use a[i]=rand()%10 for Visual Studio 
      } 
      else 
      { ct++; 
      } 
     } 
    } 
}while(!(ct==(x*y))); 

Beh io non sono un professionista in C++, ma l'ho imparato a scuola. Sto usando questo algo per 1 anno passato per memorizzare diversi valori casuali in un array 1D, ma questo funzionerà anche nell'array 2D dopo alcune modifiche. Qualsiasi suggerimento sul codice è benvenuto.

Problemi correlati