出于学习目的,这叫什么?是创建对象是数组还是哈希?
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)
有什么建议吗?
答案 0 :(得分:18)
stack_of_cards.shuffle
这是一个数组,有关详细信息,请参阅http://www.ruby-doc.org/core-1.8.7/classes/Array.html。
我已经编写了functional表单,它返回一个新的数组,而且它是一个新的数组。您可以改为使用:
stack_of_cards.shuffle!
......将阵列原位洗牌。
答案 1 :(得分:10)
如果你想要改组哈希,你可以使用这样的东西:
class Hash
def shuffle
Hash[self.to_a.sample(self.length)]
end
def shuffle!
self.replace(self.shuffle)
end
end
我发布了这个答案,因为如果我搜索“ruby shuffle hash”,我总会发现这个问题。
答案 2 :(得分:1)
除using the shuffle method外,您还可以使用排序方法:
array.sort {|a, b| rand <=> rand }
如果您使用未实现shuffle
的旧版Ruby,这可能会有用。与shuffle!
一样,您可以使用sort!
处理现有数组。
答案 3 :(得分:1)
如果你想疯狂并编写自己的就地随机播放方法,你可以做这样的事情。
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
答案 4 :(得分: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]}
答案 5 :(得分:1)
旧问题,但也许对其他人有所帮助。我用它来创建纸牌游戏,这就是@ davissp14编写的,它被称为“ Fisher-Yates算法”
if (window.ethereum) {
const web3 = new Web3(ethereum);
try {
await ethereum.enable();
var accounts = await web3.eth.getAccounts();
console.log(accounts)
} catch (error) {
// User denied account access...
}
}
现在您可以将其用作:
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
https://dev.to/linuxander/fisher-yates-shuffle-with-ruby-1p7h
答案 6 :(得分:0)
如果您想重新整理哈希,但又不想重载Hash类,则可以使用sort函数,然后使用to_h函数将其转换回哈希(Ruby 2.1 +):
which python
答案 7 :(得分:0)
对于数组:
array.shuffle
对于散列:
hash.sort_by{ rand() }