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

6
我将尝试将一组名称随机分成多个数组。每次运行时,顺序都不同。我知道如何使用以下方法拆分:
```javascript ```
 name_array = ["bob","john","rob","nate","nelly","michael"]
 array = name_array.each_slice(2).to_a
 => [["bob", "john"], ["rob", "nate"], ["nelly", "michael"]]

但是,如果我想让它每次随机输出呢?


1
你的示例根本不需要使用Array#slice。Array#sample是正确的工具。 - Todd A. Jacobs
4个回答

7

在进行同样的操作之前,先对数组进行打乱。(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"]]

哦,我明白了。不知道有洗牌方法。谢谢你的快速回复。完美地运作。 - Nate Beers

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"]]

如果您希望避免样本中出现["bob", "rob"]["rob", "bob"]两种情况,建议使用combination而不是permutation - Cary Swoveland
@CarySwoveland 是的,这是一个有效的观点,但在这种特定情况下,与洗牌或抽样相比,并没有带来太多好处。强调排列的重点是它为此输入集提供了不同类型的结果。还有许多其他数组方法,包括#combination和#each_cons,它们在不同的约束条件下产生不同类型的结果。数组和Enumerable充满了有用的小贴士。你的经验可能会有所不同。 - Todd A. Jacobs
这里,“组合”和“排列”的唯一区别在于前者在样本对中保留了name_array的排序,并防止了我上面提到的重复排序。两者都允许样本包含["bob", "john"]["bob", "rob"],尽管“排列”可能会有["john", "bob"]["rob", "bob"] - Cary Swoveland

2
array = name_array.each_slice(2).to_a.shuffle

这将每次给您不同的结果。

2

先洗牌数组,然后切片:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接