2010-09-29 2 views
6

mi hanno una serie @number = [1,2,3,4,5,6,7,8,9]
Ora, voglio randomizzare il contenuto di matrice ... qualcosa come ad esempio: [5,3,2,6,7,1,8]
Per favore mi guida come procedere con esso.randomizzazione elementi dell'array

+2

Duplicate http://stackoverflow.com/questions/1816378/how-to-randomly-sort-scramble-an-array-in-ruby – Nakilon

+1

La funzione ipotetica ha eliminato 2 elementi dalla matrice. Anche 'shuffle' non può farlo, gg! – Nakilon

risposta

9

Utilizzare il metodo shuffle ...

irb(main):001:0> [1,2,3,4,5].shuffle 
=> [3, 4, 2, 5, 1] 
-2
loop n times 
    i = random array index 
    j = random array index 
    swap elements i and j 
end 
+0

Random non garantisce i risultati correttamente distribuiti. Pertanto, lo scambio di elementi con due indici casuali potrebbe fornire array con blocchi di sequenze invariate nel mezzo. Dovresti incrementare i da 0 a n e prendere a caso j per assicurarti che * tutti gli elementi vengano scambiati almeno una volta. –

+0

Terribile. Even e odd 'n' dà due diversi set di permutazioni. È così triste, ma alcuni insegnanti insegnano agli studenti questo metodo ... Non farlo mai! – Nakilon

+0

@Nakilon: Di cosa stai parlando? Perché è importante se n è pari o dispari? – RyanHennig

7

il comando shuffle restituisce una versione randomizzato di un array

esempio:

[1,2,3].shuffle => [2,3,1] 
+1

Funziona su 1.8.7p249 –

+2

e se vuoi randomizzare sul posto, puoi semplicemente scrivere '@ number.shuffle!' – Peter

-1

Se si utilizza vecchia versione di rubino ... funzionerà

def randomize(array) 
b = [] 
array.length.downto(1) { |n| 
    b.push array.delete_at(rand(n)) 
} 
b 

fine

a = [1,2,3,4,5] b = Randomize (a) b stampa

+0

amico questo codice è un casino! – horseyguy

+0

Almeno, lui è l'unico qui, che ha dato una soluzione di lavoro senza funzioni built-in. – Nakilon

1
[1,2,3,4,5,6,7,8,9].sort_by {rand}[0,9] 
=> [5, 7, 3, 8, 9, 4, 2, 1, 6] 
+0

buono per 1.8.6 :) ma ora non aggiornato! – horseyguy