Come ordinare in modo casuale circa 20 elementi con la complessità più bassa? (generazione di permutazioni casuali)Algoritmo per generare ordine casuale di elementi
risposta
Knuth's shuffle algorithm è una buona scelta.
Deludente che qualcuno abbia detto qualcos'altro, francamente. –
Beh, sono deluso che questa sia la risposta. Dal momento che devi prima ripetere l'elenco per riempirlo e poi rimescolarlo (con un algoritmo sicuramente buono), avrei pensato che c'era una soluzione migliore. – SourceOverflow
Alcuni mesi fa ho eseguito il blogging per ottenere una permutazione casuale di un elenco di numeri interi. Potresti usarlo come una permutazione degli indici del set che contiene i tuoi elementi, e poi hai quello che vuoi.
Nel primo post mi esplorare alcune possibilità, ed infine ottengo "una funzione per permutate caso un elenco generico con O (n) complessità" , correttamente incapsulato per lavorare su dati immutabili (cioè, è privo di effetti collaterali).
Nel secondo post, lo distribuisco in modo uniforme.
Il codice è in F #, spero che non ti dispiaccia!
Buona fortuna.
EDIT: Non ho una prova formale, ma l'intuizione mi dice che la complessità di un tale algoritmo non può essere inferiore a O (n). Mi piacerebbe davvero vederlo fatto più velocemente!
la ricorsione nel secondo articolo è semplice .. penso che potrei usalo .. – Ante
Tutte le permutazioni devono essere possibili, e riorganizzare un array in un disallineamento (cioè una permutazione 'p' per cui' p (k)! = k' per tutti i 'k') richiede che ogni elemento essere visitato Quindi O (n) caso peggiore. O è ancora abbastanza formale? –
Anche O (n) caso medio della stessa dimostrazione, vieni a pensarci, dal momento che IIRC la proporzione di permutazioni di (1 ... n) che sono sconvolgimenti si avvicina a 1/e come n si avvicina all'infinito. –
Un modo semplice per rendere casuale l'ordine è creare un nuovo elenco delle dimensioni corrette (20 nel tuo caso), scorrere il primo elenco e aggiungere ciascun elemento in una posizione casuale al secondo elenco. Se la posizione casuale è già occupata, mettila nella successiva posizione libera.
penso che questo pseudocodice è corretto:
list newList
foreach (element in firstList)
int position = Random.Int(0, firstList.Length - 1)
while (newList[position] != null)
position = (position + 1) % firstList.Length
newList[position] = element
EDIT: Così si scopre che questa risposta non è in realtà che una buona. Non è né particolarmente veloce, né particolarmente casuale. Grazie per i vostri commenti. Per una buona risposta, si prega di scorrere indietro all'inizio della pagina :-)
Nel caso peggiore questo algoritmo è O (n^2) (cioè, se il generatore di numeri casuali dice "1, 1, 1, 1, 1, 1, ...", ti lascio calcolare il resto) , non molto ottimizzato. –
Mettere gli oggetti nella prossima posizione libera lo rende meno casuale. Gli oggetti manterranno il loro ordine originale più che in un casuale casuale shuffle. Per risolvere il problema dovresti scegliere una nuova posizione casuale quando viene presa una posizione, il che ovviamente lo rende molto più lento. – Guffa
Questo è un buon punto, Guffa. Non l'avevo mai capito. Grazie. Almeno ho imparato qualcosa qui :-) –
Probabilmente qualcuno ha già implementato il mischiare per voi. Ad esempio, in Python è possibile utilizzare random.shuffle
, in C++ random_shuffle
e in PHP shuffle
.
hmm .. php forse? – Ante
Sorprendentemente, in PHP si chiama 'shuffle' :) aggiorno la mia risposta. –
- 1. Perle di programmazione - Algoritmo di selezione casuale
- 2. Algoritmo pseudo-casuale semplice
- 3. Algoritmo per generare la maschera di bit
- 4. Algoritmo ottimale per generare un numero casuale R non in un insieme di numeri N
- 5. jQuery, ordine casuale div
- 6. Utilizzo dell'array per generare testo casuale
- 7. utilizzando RNGCryptoServiceProvider per generare stringa casuale
- 8. Ordine XML degli elementi
- 9. Ordine casuale e impaginazione Elasticsearch
- 10. Rails: ciascuno in ordine casuale
- 11. Come generare un'immagine completamente casuale?
- 12. Algoritmo per generare stringhe casuali con restrizioni severe - Java
- 13. Algoritmo per O (1) selezione casuale ponderata con rimozione
- 14. generare flusso di byte casuale con `C`
- 15. Funzione per generare nel tempo un numero di incremento casuale
- 16. C#: algoritmo numerico per generare numeri dalla distribuzione binomiale
- 17. Riproduzione casuale di elementi in un elenco (riordinamento casuale degli elementi di elenco)
- 18. ordine query mysql per più elementi
- 19. Quale algoritmo utilizzare per generare orari per le scuole
- 20. Riorganizzare NSArray/MSMutableArray in ordine casuale
- 21. I metodi richiamano in ordine casuale (C#)
- 22. php ordine casuale da un foreach
- 23. Restituire le righe in ordine casuale
- 24. Come generare una data casuale in Ruby?
- 25. Un algoritmo per la generazione casuale di partizioni intere di una lunghezza particolare, in Python?
- 26. Come eseguire iterazioni in dict in ordine casuale in Python?
- 27. Interleaving di più iterabili in ordine casuale preservando il loro ordine in python
- 28. Come generare il numero float casuale C
- 29. Librerie o strumenti per generare testo casuale ma realistico
- 30. Pacchetto Django per generare una stringa alfanumerica casuale
Cosa intendi con cca? –
Analisi di correlazione canonica? –
Cosa intendi con? : P –