|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jun 2007
Messaggi: 38
|
[C++]Generare numeri casuali distinti
Salve a tutti, come da titolo ho bisogno di generare n numeri casuali Distinti
La mia soluzione è: Codice:
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
}
}
Qualcuno saprebbe consigliarmi un'altra soluzione? Ultima modifica di spidey : 06-02-2009 alle 18:39. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Molto interessante questo metodo
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. |
|
|
|
|
|
#3 | |
|
Member
Iscritto dal: Jun 2007
Messaggi: 38
|
Quote:
Mi sa che non mi resta che utilizzare questa soluzione allora, il bitset penso che lo tralascerò in questo caso. Ti ringrazio |
|
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Dec 2006
Messaggi: 198
|
Ogni intero occupa 4 byte, 4 * 10000 = 40kb. Decisamente accettabile
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
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.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:54.




















