如何在Ruby中混洗数组/散列?

sxissh06  于 2022-10-15  发布在  Ruby
关注(0)|答案(9)|浏览(162)

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

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)
...

以下是我的Card类:

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)
有什么建议吗?

bejyjqdl

bejyjqdl1#

stack_of_cards.shuffle

它是一个数组,更多信息请参见http://www.ruby-doc.org/core-1.8.7/classes/Array.html
我已经编写了functional表单,它返回一个新的数组,并且它是经过改组的新数组。您可以改用:

stack_of_cards.shuffle!

...将阵列就地洗牌。

kkih6yb8

kkih6yb82#

如果您想要对散列进行混洗,可以使用如下内容:

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

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

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

ecfsfe2w

ecfsfe2w3#

除了使用Shuffle方法外,还可以使用Sort方法:

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

如果您使用的是未实现shuffle的旧版本Ruby,这可能会很有用。与shuffle!一样,您可以使用sort!在现有阵列上工作。

2uluyalo

2uluyalo4#

如果您想疯狂地编写您自己的就地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
holgip5t

holgip5t5#

对于阵列:

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]}
4c8rllxm

4c8rllxm6#

老问题,但也许能帮到别人。我用它创造了一个纸牌游戏,@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

p5fdfcr1

p5fdfcr17#

如果要对散列进行置乱,但不希望重载Hash类,则可以使用排序函数,然后使用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
7cjasjjr

7cjasjjr8#

对于阵列:
array.shuffle
对于散列:
hash.sort_by{ rand() }

5m1hhzi4

5m1hhzi49#

另一种散列混洗是..

hash.to_a.shuffle.to_h

相关问题