PDA

View Full Version : [C++]Generare numeri casuali distinti


spidey
06-02-2009, 17:30
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?

cionci
07-02-2009, 08:45
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.

spidey
09-02-2009, 12:46
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 ;)

Mesh89
09-02-2009, 13:44
Ogni intero occupa 4 byte, 4 * 10000 = 40kb. Decisamente accettabile ;)

gugoXX
09-02-2009, 14:36
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.