我试图在每次运行时以随机顺序将一个名称数组拆分成多个数组。我知道如何拆分它们:
name_array = ["bob","john","rob","nate","nelly","michael"]
array = name_array.each_slice(2).to_a
=> [["bob", "john"], ["rob", "nate"], ["nelly", "michael"]]
但是,如果我希望它每次都以随机顺序吐出来怎么办?
答案 0 :(得分:6)
在做同样的事情之前,将数组洗牌。 (Array#shuffle
)
name_array.shuffle.each_slice(2).to_a
# => [["nelly", "nate"], ["rob", "bob"], ["michael", "john"]]
或者,根据您的需要随后洗牌:
name_array.each_slice(2).to_a.shuffle
# => [["nelly", "michael"], ["rob", "nate"], ["bob", "john"]]
答案 1 :(得分:3)
如果你知道原始数组的大小,那么:
name_array.sample 6
Array#sample缩短了使用Array#shuffle的方法链。如果您不想对样本的大小进行硬编码,则可以在运行时对数组的大小进行内省。例如:
name_array.sample(name_array.size)
如果您不想坚持在结果集中只出现一次给定名称,那么您也可以考虑Array#permutation:
name_array.permutation(2).to_a.sample(name_array.size)
结果会有所不同,但这里有一个非常印刷的样本,您可以从这种方法中得到结果:
[["michael", "rob"],
["bob", "nelly"],
["rob", "bob"],
["michael", "nelly"],
["john", "michael"],
["john", "rob"]]
答案 2 :(得分:2)
首先对阵列进行随机播放,然后切片:
["bob","john","rob","nate","nelly","michael"].shuffle.each_slice(2).to_a
#=> [["nelly", "nate"], ["rob", "michael"], ["john", "bob"]]
答案 3 :(得分:2)
array = name_array.each_slice(2).to_a.shuffle
每次都会给你不同的结果。