View Full Version : [C++]Generare numeri casuali distinti
Salve a tutti, come da titolo ho bisogno di generare n numeri casuali Distinti
La mia soluzione è:
int main()
{
// array per la ricerca casuale
for (i=0; i<n; i++)
A[i]=i;
// cerco elemento casuale tra i primi j valori di A
j=n;
for (i=0; i<n; i++)
{
temp = 1+ rand()%j; // scelgo un elemento casuale dell'array
estratto= A[temp]; //ne estraggo il valore
cout<<estratto;
A[temp]=A[j-1]; //scambio l' ultimo elemento con quello appena estratto
j--; //ignoro l' ultimo elemento per la prossima estrazione
}
}
Il problema è che a me serve generare valori su di un intervallo molto ampio, come 1 - 10000. In questo modo creerei un array enorme.
Qualcuno saprebbe consigliarmi un'altra soluzione?
Molto interessante questo metodo :) Non ci avevo mai pensato a compattare il vettore in questo modo.
Non mi torna solo questo:
temp = 1+ rand()%j;
temp è un valore che va da 1 a j. Per rimanere all'interno dei limite del vettore devono andare da 0 a j-1 ;)
Comunque davvero bella soluzione.
Sulla dimensione del vettore...un vettore di quella dimensione è assolutamente accettabile, anche 100 volte più grande va bene (meglio comunque allocarlo dinamicamente).
Se invece pensi di avere un vettore troppo grande puoi usare un bitset, ma per ogni numero estratto devi scorrere il bitset fino alla posizione del numero estratto.
Molto interessante questo metodo :) Non ci avevo mai pensato a compattare il vettore in questo modo.
Non mi torna solo questo:
temp = 1+ rand()%j;
temp è un valore che va da 1 a j. Per rimanere all'interno dei limite del vettore devono andare da 0 a j-1 ;)
Comunque davvero bella soluzione.
Sulla dimensione del vettore...un vettore di quella dimensione è assolutamente accettabile, anche 100 volte più grande va bene (meglio comunque allocarlo dinamicamente).
Se invece pensi di avere un vettore troppo grande puoi usare un bitset, ma per ogni numero estratto devi scorrere il bitset fino alla posizione del numero estratto.
Si hai perfettamente ragione, errore di distranzione :D
Mi sa che non mi resta che utilizzare questa soluzione allora, il bitset penso che lo tralascerò in questo caso.
Ti ringrazio ;)
Ogni intero occupa 4 byte, 4 * 10000 = 40kb. Decisamente accettabile ;)
Ciao.
I generatori di numeri psuedo-casuali ciclici si basano su semplici formule matematiche, senza bisogno di memoria.
Sono costruiti con un polinomio generatore, ed assicurano di restituire tutti i valori del range, senza ripetere mai un risultato, restituendo quindi tutti gli N valori, in modo pseudo-casuale, in N diversi passi dell'algoritmo.
(e poi riprendono la serie identicamente daccapo, ma a quel punto se serve si puo' cambiare eventualmente polinomio generatore ed ottenere quinid una nuova serie diversa).
Che forse e' un po' quello che vuoi, in letteratura dovresti trovare abbastanza.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.