Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 随机化数组元素_Ruby_Shuffle - Fatal编程技术网

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)
打印b

Random不保证提供正确分布的结果。因此,用两个随机索引交换元素可能会在中间给您提供具有不变序列的块。您应该将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]