10

出于学习目的,这叫什么?创建的对象是数组还是散列?

stack_of_cards = []

这就是我填充它的方式:

stack_of_cards << Card.new("A", "Spades", 1)
stack_of_cards << Card.new("2", "Spades", 2)
stack_of_cards << Card.new("3", "Spades", 3)
...

这是我的卡片类:

class Card

  attr_accessor :number, :suit, :value

  def initialize(number, suit, value)
    @number = number
    @suit = suit
    @value = value
  end

  def to_s
    "#{@number} of #{@suit}"
  end
end

我想打乱这个数组/哈希中的元素(这叫什么?:S)

有什么建议么?

4

8 回答 8

21
stack_of_cards.shuffle

它是一个数组,有关更多信息,请参阅http://www.ruby-doc.org/core-1.8.7/classes/Array.html

我写了函数形式,它返回一个新的数组,它是新的被洗牌的。您可以改为使用:

stack_of_cards.shuffle!

...就地洗牌阵列。

于 2011-02-20T22:54:49.780 回答
12

如果你想洗牌一个哈希,你可以使用这样的东西:

class Hash
  def shuffle
    Hash[self.to_a.sample(self.length)]
  end

  def shuffle!
    self.replace(self.shuffle)
  end
end

我已经发布了这个答案,因为如果我搜索“ruby shuffle hash”,我总是会找到这个问题。

于 2012-12-17T17:43:32.380 回答
1

除了使用 shuffle 方法,还可以使用 sort 方法:

array.sort {|a, b| rand <=> rand }

shuffle如果您使用的是未实现的旧版 Ruby,这可能会很有用。与 一样shuffle!,您可以使用sort!来处理现有阵列。

于 2011-02-21T00:34:27.443 回答
1

如果您想发疯并编写自己的就地 shuffle 方法,您可以这样做。

 def shuffle_me(array)
   (array.size-1).downto(1) do |i|
     j = rand(i+1)
     array[i], array[j] = array[j], array[i]
   end

   array
 end 
于 2013-05-31T06:29:17.157 回答
1

对于数组:

array.shuffle
[1, 3, 2].shuffle
#=> [3, 1, 2]

对于哈希:

Hash[*hash.to_a.shuffle.flatten]
Hash[*{a: 1, b: 2, c: 3}.to_a.shuffle.flatten(1)]
#=> {:b=>2, :c=>3, :a=>1}
#=> {:c=>3, :a=>1, :b=>2}
#=> {:a=>1, :b=>2, :c=>3}
# Also works for hashes containing arrays
Hash[*{a: [1, 2], b: [2, 3], c: [3, 4]}.to_a.shuffle.flatten(1)]
#=> {:b=>2, :c=>3, :a=>1}
#=> {:c=>[3, 4], :a=>[1, 2], :b=>[2, 3]}
于 2017-02-16T21:57:30.220 回答
1

老问题,但也许对其他人有帮助。我用它来创建一个纸牌游戏,这就是@davissp14 写的,它被称为“Fisher-Yates 算法”

module FisherYates

  def self.shuffle(numbers)
    n = numbers.length
    while n > 0 
      x = rand(n-=1)
      numbers[x], numbers[n] = numbers[n], numbers[x]
    end
    return numbers
  end

end 

现在您可以将其用作:

numbers_array = [1,2,3,4,5,6,7,8,9]
asnwer = FisherYates.shuffle(numbers_array)
return answer.inspect

https://dev.to/linuxander/fisher-yates-shuffle-with-ruby-1p7h

于 2020-12-13T19:11:54.117 回答
0

如果您想打乱哈希,但不想重载 Hash 类,您可以使用 sort 函数,然后使用 to_h 函数(Ruby 2.1+)将其转换回哈希:

a = {"a" => 1, "b" => 2, "c" => 3}
puts a.inspect
a = a.sort {|a, b| rand <=> rand }.to_h
puts a.inspect
于 2018-07-18T19:47:34.380 回答
0

对于数组:

array.shuffle

对于哈希:

hash.sort_by{ rand() }

于 2021-01-28T15:39:28.443 回答