2010-09-29 35 views
6

Mam tablicę @number = [1,2,3,4,5,6,7,8,9]
Teraz chcę losowe zawartości tablicy ... coś jak np [5,3,2,6,7,1,8]
proszę kierować mi jak postępować z nim.losowanie elementy tablicy

+2

zduplikowane http://stackoverflow.com/questions/1816378/how-to-losowo-sortuj-mieszaj-an-tablica-w-ruby – Nakilon

+1

Twoja hipotetyczna funkcja upuściła 2 elementy z tablicy. Nawet 'shuffle' nie może tego zrobić, gg! – Nakilon

Odpowiedz

9

Użyj metody 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

Losowe nie gwarantuje poprawnych wyników. Dlatego też zamiana elementów na dwa losowe indeksy może dać tablicę z blokami niezmienionych sekwencji w środku. Powinieneś zwiększyć od 0 do n i zrobić losowo j, aby zapewnić, że * wszystkie * elementy zostaną zamienione co najmniej raz. –

+0

Straszne. Równe i nieparzyste 'n' daje dwa różne zestawy permutacji. To takie smutne, ale wciąż niektórzy nauczyciele uczą studentów tej metody ... Nigdy tego nie rób! – Nakilon

+0

@Nakilon: O czym ty mówisz? Dlaczego ma znaczenie, czy n jest parzyste czy nieparzyste? – RyanHennig

7

komenda shuffle zwraca randomizowane wersję tablicy

np

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

Działa na 1.8.7p249 –

+2

i jeśli chcesz losować na miejscu, możesz po prostu napisać '@ number.shuffle!' – Peter

-1

Jeśli używasz starej wersji ruby ... to zadziała

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

koniec

a = [1,2,3,4,5] B = losowy (a) drukowania B

+0

gość ten kod to bałagan! – horseyguy

+0

Przynajmniej on jest tu jedynym, który dał działające rozwiązanie bez wbudowanych funkcji. – 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

dobre dla 1.8.6 :), ale teraz nieaktualne! – horseyguy

Powiązane problemy