Ale ti ha dato un'idea, ma in effetti andare a controllare di volta in volta tutto l'array è estremamente penalizzante!
Ci sono fondamentalmente 2 algoritmi per generare numeri random senza ripetizione, quello che usa Ale è quello meno efficiente e funziona così:
Supponi di generare un numero casuale tra 1 e 90.
* E' già stato selezionato? Se sì vai avanti, se no generane un altro.
Adesso supponi di aver già generato i numeri da 1 a 89 e manca solo il 90... Generi un numero, è già uscito, generi un altro numero, è già uscito, generi un altro numero, è già uscito... Finché non generi il 90 !!
Questo, teoricamente, potrebbe continuare all'infinito.
- - - - - - - - - - - - - - - - - - - - - - - -
L'Algoritmo Efficientissimo (miscelatore) invece funziona così:
1) Riempi un vettore (1..N) con i valori 1, 2, 3, ..., N ( ovvero v[1]=1; v[2]=2; v[n]=n; )
2) MESCOLA il vettore
3) Restituisci, uno alla volta i numeri presenti nel vettore, dal primo all'ultimo :)
Punto 1:
VET[1 to N] : intero;
FOR I=1 TO N
.....VET[I]=I;
Punto 2:
FOR I=1 TO N
.....FOR J=1 TO N
..........A = RANDOM ( 1, N )
..........B = RANDOM ( 1, N )
..........SCAMBIA ( A, B )
Punto 3:
FOR I=1 TO N
.....Scrivi VET[I]