come faccio a fare questo, ma in modo che posso controllare se il valore è già nella matrice e in tal caso generare un valore nuovo
Lei non farlo, mai, perché che è una pessima idea.
Per illustrare il motivo per cui è una pessima idea, prendere in considerazione un'altra versione dello stesso problema: ordinare un milione di numeri in un ordine casuale dal seguente processo:
- scegliere un numero da uno a un milione.
- Verificare se è già presente nell'elenco.
- In caso affermativo, tornare al passaggio 1
- In caso contrario, aggiungere il numero all'elenco.
- L'elenco contiene un milione di articoli? Se sì, hai finito. In caso contrario, tornare al passaggio 1.
Chiaramente questo funziona. È una buona idea? Supponiamo che tu abbia quasi finito. L'elenco contiene 999999 elementi. L'unico elemento mancante è 857313. Che cosa fai? Scegli un numero casuale, diciamo, 12. Ora controlli gli articoli 999999 nell'elenco per vedere se uno di essi è 12. 12 potrebbe essere stato uno dei primi numeri che hai scelto, quindi potrebbe essere veloce trovarlo. O potrebbe essere uno degli ultimi, quindi ci vorrà molto tempo. In media ci vorranno 500000 assegni per vedere se 12 sono nella lista. Ed è, dal momento che c'è un solo numero mancante dalla lista.
12 non ha funzionato. Torna all'inizio. Scegli un altro numero casuale, ad esempio 53259. È presente nell'elenco? Altri mezzo milione di assegni.
Continuate così fino a quando non generate 857313, che avviene ogni milione di tentativi.
Quindi, in media, mettere l'ultimo elemento nell'elenco richiede 500000 x 1000000 = cinquecento miliardi di confronti. Potrebbe volerci molto di più. Potrebbero essere necessari diversi trilioni di confronti. O potresti essere fortunato e ci vuole uno. Ma in media, mezzo trilione di confronti.
Questo è un terribile modo per produrre un ordine casuale di un elenco.
Esistono due modi per effettuare un ordinamento casuale di un elenco.
(1) Creare un dispositivo in grado di ordinare un elenco in base alla funzione di ordinamento. Fornire un ordine stabile a basato su un seme casuale.
Si noti che è necessario non produrre un ordine casuale eseguendo un metodo che restituisce risultati casuali quando viene richiesto "è maggiore di B?" Questo è un ordine instabile; molti algoritmi di ordinamento sono previsti su un ordinamento di ordinamento stabile e andranno in loop infiniti o hanno altri comportamenti errati quando viene fornito un ordinamento di ordinamento instabile.
Questo algoritmo è O (n lg n) e ha la bella proprietà che è molto facile scrivere su parti standard, come indicano altre risposte. È anche estremamente veloce per piccoli elenchi in implementazioni tipiche.
(2) Scegliere un elemento per indice da un elenco di origini casuali, rimuovere dall'elenco di origini mentre si va e inserirlo nell'elenco di destinazioni.
Quest'ultimo è noto come Knuth Shuffle o Fischer-Yates Shuffle ed è un algoritmo molto veloce. Puoi farlo "sul posto", trasformando un array esistente in ordine casuale o creando un nuovo elenco. Ha anche la bella proprietà che puoi "pagare per giocare", mischiando la "cima" della lista quando ne hai bisogno. Se hai un milione di oggetti da mescolare ma hai bisogno solo dei primi cento, puoi calcolare l'ordinamento per i primi cento e chiamarlo buono.
Gli odori come compiti a casa, in particolare con i commenti sotto i (validi, buoni) suggerimenti con uno scheletro che sembra essere parte del compito: "Inizia con questo codice" –
sì, è davvero una parte dei compiti che non lo faccio mentire sul fatto che io sono solo bloccato in una parte e voglio così suggerimenti/feedback che non è male suppongo che – ShallowHeart
corretto indentazione del codice e nomi di variabili migliori aiuterebbe le persone a capire il tuo codice e di conseguenza ti danno soluzioni migliori. – CesarGon