Le paroline magiche per questo genere di applicazioni sono "shuffle" e "Knuth". Si veda
qui, ma soprattutto il lungo thread referenziato all'inizio del post.
Vale anche la pena di riportare per l'ennesima volta una nota che troppo spesso viene trascurata.
L'algoritmo di shuffle “di Knuth” è stato pubblicato per la prima volta nella sua forma attuale, com'è ben noto, da R. Durstenfeld (R. Durstenfeld, "Algorithm 235: Random permutation", Communications of the ACM 7 (1964), no. 7, 420). L'attribuzione “shuffle di Fisher e Yates” invece
non è universalmente accettata senza discussioni, come molte fonti online paiono erroneamente ritenere (o, peggio, vorrebbero far credere).
L'originale algoritmo pubblicato nel 1938 da Ronald Fisher e Frank Yates, semplicemente,
non era computabile e non si basava in modo specifico sull'aumento di efficienza dell'operazione di cancellazione da un array (realizzata in O(1) tramite un semplice scambio con l'ultimo elemento e la riduzione di una unità della dimensione dell'array, per le mosse successive). Poiché
esattamente in questa idea consiste l'asse portante dell'algoritmo e la chiave del suo successo applicativo, molti rifiutano la prassi di “cointestare” l'algoritmo stesso e considerano unicamente la pubblicazione di Durstenfeld come l'atto di nascita di tale procedura di shuffle in senso strettamente informatico: senza per questo voler togliere a Fisher e Yates una doverosa menzione (magari in una nota o commento) e senza sminuire in alcun modo i loro meriti. Meriti che peraltro sono e rimangono numerosi, anche in campo discretistico: a partire dai loro contributi allo studio dei block designs, dei quali rimane traccia ancor oggi nel fatto che la cardinalità dell'insieme degli elementi in un BD è curiosamente indicata con la lettera v, a memoria dell'originale “varieties of wheat” di cui si occupavano i due ricercatori; per non dire della notissima disuguaglianza di Fisher per i block designs BIBD, intuitiva quanto fondamentale: in ogni (v,b,r,k,lambda)-BIBD, il numero dei blocchi b è sempre non minore del numero v di elementi dell'insieme di scelta.
Nota di moderazione: Per questa volta sono intervenuto personalmente a modificare i vari messaggi per inserire i tag CODE. Naturalmente ci si aspetta che l'OP impari ad usarli per il futuro.