如何在Ruby中对数组进行随机排序(置乱)?

如何在Ruby中对数组进行随机排序(置乱)?,ruby,arrays,random,shuffle,Ruby,Arrays,Random,Shuffle,我想把我的阵法物品打乱。 大概是这样的: [1,2,3,4].scramble => [2,1,3,4] [1,2,3,4].scramble => [3,1,2,4] [1,2,3,4].scramble => [4,2,3,1] 依此类推,现在随机内置: [1,2,3,4].shuffle => [2, 1, 3, 4] [1,2,3,4].shuffle => [1, 3, 2, 4] 对于ruby 1.8.6(没有内置shuffle): 扩展库有一个模块

我想把我的阵法物品打乱。 大概是这样的:

[1,2,3,4].scramble => [2,1,3,4]
[1,2,3,4].scramble => [3,1,2,4]
[1,2,3,4].scramble => [4,2,3,1]
依此类推,现在随机内置:

[1,2,3,4].shuffle => [2, 1, 3, 4]
[1,2,3,4].shuffle => [1, 3, 2, 4]
对于ruby 1.8.6(没有内置shuffle):

扩展库有一个模块,提供有用的方法,包括
shuffle
shuffle
到一系列核心类,包括
Array
Hash
String


如果您使用Rails,请小心,因为我在monkeypatching与Rails的冲突中遇到了一些严重的冲突,…

对于ruby 1.8.6,正如sepp2k的示例,但您仍然希望使用“shuffle”方法

为Ruby 1.8.6的数组干杯。内置Ruby 1.8.7或更高版本

class Array
  # Standard in Ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Array.html]
  def shuffle
    dup.shuffle!
  end unless method_defined? :shuffle

  # Standard in Ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Array.html]
  def shuffle!
    size.times do |i|
      r = i + Kernel.rand(size - i)
      self[i], self[r] = self[r], self[i]
    end
    self
  end unless method_defined? :shuffle!
end

如果你想自己实现它:或者如果你想在Ruby<1.9中实现它,那么要求“Backport”看起来也在Ruby 1.8.7中。那太棒了。只想添加:如果你想影响集合,添加一个
在调用洗牌后。没有
将返回洗牌数组,并且可以进行赋值。@Josh:您链接到的页面描述了一个完全不同的算法。请注意,ruby的
sort_by
函数与javascript的sort函数(或ruby的sort函数)不同,后者只关心计算的数字是小于零、还是大于零。相反,
sort_by
会记住每个项目的计算值,然后根据该值对项目进行排序。因此,在这种情况下,为每个项目分配一个随机数,然后按这些随机数对数组进行排序。对于大型数组,按每个项目的随机数进行排序可能需要太长时间(O(NLogN),我们可以在线性时间内完成这项工作,如果我们从之前洗牌的项生成一个随机数,然后交换为迭代器增量。
class Array
  def shuffle
    sort_by { rand }
  end
end

[1,2,3,4].shuffle #=> [2,4,3,1]
[1,2,3,4].shuffle #=> [4,2,1,3]
class Array
  # Standard in Ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Array.html]
  def shuffle
    dup.shuffle!
  end unless method_defined? :shuffle

  # Standard in Ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Array.html]
  def shuffle!
    size.times do |i|
      r = i + Kernel.rand(size - i)
      self[i], self[r] = self[r], self[i]
    end
    self
  end unless method_defined? :shuffle!
end