Ruby 随机化数组元素
我有一个数组Ruby 随机化数组元素,ruby,shuffle,Ruby,Shuffle,我有一个数组@number=[1,2,3,4,5,6,7,8,9] 现在,我想随机化数组内容。。。例如:[5,3,2,6,7,1,8] 请指导我如何继续。使用洗牌方法 loop n times i = random array index j = random array index swap elements i and j end irb(main):001:0> [1,2,3,4,5].shuffle => [3, 4, 2, 5, 1] shuffle命
@number=[1,2,3,4,5,6,7,8,9]
现在,我想随机化数组内容。。。例如:
[5,3,2,6,7,1,8]
请指导我如何继续。使用
洗牌
方法
loop n times
i = random array index
j = random array index
swap elements i and j
end
irb(main):001:0> [1,2,3,4,5].shuffle
=> [3, 4, 2, 5, 1]
shuffle
命令返回数组的随机版本
例如:
如果您使用的是旧版本的ruby。。。这会奏效的
def randomize(array)
b = []
array.length.downto(1) { |n|
b.push array.delete_at(rand(n))
}
b
结束
a=[1,2,3,4,5]
b=随机化(a)
打印bRandom不保证提供正确分布的结果。因此,用两个随机索引交换元素可能会在中间给您提供具有不变序列的块。您应该将i从0增加到n,并随机取j,以确保所有元素至少交换一次。偶数和奇数
n
给出两组不同的排列。这是很悲哀的,但仍然有一些老师教学生这种方法。。。永远不要那样做@你在说什么?为什么n是偶数还是奇数很重要?@RyanHennig。1.如果你给我原始的数组
和n
,我应该告诉你,你不能得到置换集的一半,你能得到什么。使用[1,2,3,4,5]
和n%2==1
您将永远无法获得[5,4,3,2,1]
。2.此外,在理想的随机填充数组中,1
元素在其原始位置(它将位于oredered数组中)。您对1mln
元素数组的洗牌将至少需要7mln
交换,才能使2
元素数组位于其原始位置。@gaearon:不需要确保所有元素至少交换一次。复制您的缩略函数从数组中删除了2个元素。即使是洗牌也不行,gg!如果你想随机化,你可以写@number.shuffle代码>至少,他是这里唯一一个没有内置函数的工作解决方案的人。
def randomize(array)
b = []
array.length.downto(1) { |n|
b.push array.delete_at(rand(n))
}
b
[1,2,3,4,5,6,7,8,9].sort_by {rand}[0,9]
=> [5, 7, 3, 8, 9, 4, 2, 1, 6]