Ho bisogno di mescolare un array in modo che tutti gli elementi dell'array cambino la loro posizione. Dato un array [0,1,2,3]
sarebbe ok per ottenere [1,0,3,2]
o [3,2,0,1]
ma non [3,1,2,0]
(perché 2
lasciato invariato). Suppongo che l'algoritmo non sia specifico della lingua, ma nel caso, ne ho bisogno nel programma C++ (e non posso usare std::random_shuffle
a causa del requisito aggiuntivo).Come mescolare un array in modo che tutti gli elementi cambino la loro posizione
risposta
For each element e
If there is an element to the left of e
Select a random element r to the left of e
swap r and e
Ciò garantisce che ciascun valore non è nella posizione in cui è stato avviato, ma non garantisce che ogni valore cambi se sono presenti duplicati.
Stai facendo il contrario per sto bene? –
In entrambi i casi funziona bene –
Credo che sia una variante di Fisher-Yates shuffle, noto come [l'algoritmo di Sattolo] (http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle). – jrok
Non sarà molto casuale, ma è possibile ruotare tutti gli elementi almeno una posizione:
std::rotate(v.begin(), v.begin() + (rand() % v.size() - 1) + 1, v.end());
Se v
era {1,2,3,4,5,6,7,8,9}
all'inizio, poi dopo la rotazione sarà, ad esempio: {2,3,4,5,6,7,8,9,1}
oppure {3,4,5,6,7,8,9,1,2}
, ecc.
Tutti gli elementi dell'array cambieranno posizione.
C'è un problema con questa soluzione? – piokuc
Questo non mescola l'array. Dà un risultato prevedibile. – 0x499602D2
+1. Soluzione semplice e correttaNon vedo alcun motivo per includere la casualità nella soluzione, non ha nulla a che fare con il problema dichiarato. – SomeWittyUsername
Che dire di questo?
- allocare una matrice che contiene i numeri da 0 a arrayLength-1
- Mescola matrice
- Se non v'è alcun elemento dell'array con indice uguale al valore di, passare al punto 4; altrimenti ripetere dal passaggio 2.
- Utilizzare i valori di array shuffled come indici per l'array.
Questo sembra carino perché è possibile esternalizzare lo shuffling a 'std :: random_shuffle' e il rimescolamento sembra la parte più difficile. – CallMeNorm
Ho una specie di idea nella speranza che sia adatta alla vostra applicazione. Avere un altro contenitore e questo contenitore sarà una "mappa (int, vector (int))". L'elemento chiave mostrerà l'indice e il secondo elemento il vettore conterrà i valori già utilizzati.
Ad esempio per il primo elemento si utilizzerà la funzione rand per trovare quale elemento della matrice si dovrebbe usare. Si verificherà la struttura della mappa se questo elemento dell'array è stato utilizzato per questo indice.
Mi dispiace per "map (int, vector (int))" Non riuscivo a capire come usare "<" invece "(" –
- 1. Ottieni l'elenco di tutti gli elementi in un array JavaScript
- 2. Trova numero di elementi consecutivi che sono gli stessi prima che cambino
- 3. Come ottenere tutti gli elementi con NSPredicate CONTAINS IN array
- 4. Backbone.js Come mescolare gli elementi all'interno di una raccolta
- 5. javascript: rimuovere tutti gli elementi oggetto di un array associativo
- 6. Django: interrogare tutti gli elementi che hanno un punto chiave esterna a loro
- 7. Javascript: esiste un modo per distruggere tutti gli elementi di un array con un solo comando?
- 8. System.Linq.Enumerable.Reverse copia tutti gli elementi internamente a un array?
- 9. Come aggiungere spazio tra gli elementi in modo che riempiano il loro div contenitore?
- 10. Moltiplica tutti gli elementi nell'array
- 11. Come mescolare due array in Java?
- 12. Mongodb - modo corretto per cancellare tutti gli elementi in un campo array?
- 13. Come faccio a confrontare tutti gli elementi di due array?
- 14. quadratura tutti gli elementi in una lista
- 15. Come posso restituire tutti gli elementi precedenti in un array JavaScript rispetto a un valore corrente?
- 16. serie di elementi avvolgere tutti gli elementi
- 17. Sostituisci tutti gli elementi in Knockout.js osservabileArray
- 18. Ripristino di tutti gli elementi della GUI alle loro dimensioni/posizioni predefinite in NetBeans
- 19. Come posso verificare se tutti gli elementi di un array sono identici in Perl?
- 20. Come contare tutti gli elementi in un dizionario annidato?
- 21. Come controllare tutti gli elementi in un elenco che ha un requisito specifico?
- 22. Cambiare tutti gli elementi dell'array che includono una stringa specifica
- 23. Come inizializzare tutti gli elementi di un array su qualsiasi valore specifico in java
- 24. Query Mongo - Array, trova solo dove tutti gli elementi corrispondono
- 25. Come posso rimuovere tutti gli elementi nulli in un array Swift?
- 26. Rimuovere tutti gli elementi dell'array tranne quello che voglio?
- 27. Come verificare se tutti gli elementi di un array sono uguali, in matlab?
- 28. Come si uniscono gli elementi ripetuti consecutivi in un array?
- 29. Come inserire un nuovo elemento tra tutti gli elementi di un array Ruby?
- 30. In D come si applica una funzione a tutti gli elementi di un array?
Avete dei requisiti di memoria? È possibile creare un nuovo array della stessa dimensione del primo e quindi spostare semplicemente ciascun elemento in array1 in una nuova posizione casuale in array2. Se il valore è già stato impostato, riprova. Forza molto bruta. – Liron
Un altro approccio: iniziare con l'indice 0 e scambiarlo con un altro indice casuale. Mantieni un elenco di tutti gli indici che sono già stati scambiati. Scorrere l'elenco, scambiando solo con elementi non aggiornati. – Liron
L'approccio più semplice, anche se completamente non casuale, sposta tutti gli elementi dell'array in base alle posizioni x. Dovrebbe essere facile da fare in qualsiasi lingua, basta creare un nuovo array, copiare il primo gruppo in un offset, quindi copiare il resto all'inizio. –