У меня есть массив @number = [1,2,3,4,5,6,7,8,9]
Теперь я хочу, чтобы рандомизации содержимого массива ... что-то вроде, например: [5,3,2,6,7,1,8]
, пожалуйста, руководство меня, как поступить с ним.Стохастизирующих элементы массива
ответ
Используйте метод shuffle
...
irb(main):001:0> [1,2,3,4,5].shuffle
=> [3, 4, 2, 5, 1]
loop n times
i = random array index
j = random array index
swap elements i and j
end
Случайно не гарантированно дает правильно распределенные результаты. Следовательно, замена элементов с двумя случайными индексами может дать вам массив с блоками неизменных последовательностей в середине. Вы должны увеличивать i от 0 до n и принимать случайные j, чтобы гарантировать, что * все * элементы будут заменены хотя бы один раз. –
Ужасно. Четный и нечетный 'n' дает два разных набора перестановок. Это так грустно, но все же некоторые преподаватели учат студентов этому методу ... Никогда не делайте этого! – Nakilon
@Nakilon: О чем ты говоришь? Почему имеет значение, если n четно или нечетно? – RyanHennig
команда shuffle
возвращает рандомизированное версию массива
например:
[1,2,3].shuffle => [2,3,1]
Работает на 1.8.7p249 –
, и если вы хотите рандомизировать на месте, вы можете просто написать '@ number.shuffle!' – Peter
Если вы используете старую версию рубина ... это будет работать
def randomize(array)
b = []
array.length.downto(1) { |n|
b.push array.delete_at(rand(n))
}
b
конец
а = [1,2,3,4,5] Ь = Randomize (а) печати б
[1,2,3,4,5,6,7,8,9].sort_by {rand}[0,9]
=> [5, 7, 3, 8, 9, 4, 2, 1, 6]
хорошо для 1.8.6 :) но теперь устаревший! – horseyguy
Дубликат http://stackoverflow.com/questions/1816378/how-to-randomly-sort-scramble-a-array-in-ruby – Nakilon
Ваша гипототическая функция сбросила 2 элемента из массива. Даже «shuffle» не может этого сделать, gg! – Nakilon