以随机顺序将数组拆分为多个数组 - Ruby

时间:2014-08-05 15:30:12

标签: ruby arrays random slice

我试图在每次运行时以随机顺序将一个名称数组拆分成多个数组。我知道如何拆分它们:

 name_array = ["bob","john","rob","nate","nelly","michael"]
 array = name_array.each_slice(2).to_a
 => [["bob", "john"], ["rob", "nate"], ["nelly", "michael"]]

但是,如果我希望它每次都以随机顺序吐出来怎么办?

4 个答案:

答案 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

每次都会给你不同的结果。