成对平均分配数组,组合/排列问题

时间:2019-05-14 20:12:21

标签: ruby combinations permutation

我正在尝试解决一个组合/排列问题,我有10个人,他们应该检查其他人的想法。每个人都应该仔细检查3个想法,例如: 人物1:评论2、3、4 人2:评论5,8,9 人3:评论9、10、1 ... 等

限制是:

  1. 10是一个动态数字,因此解决方案也应该是动态的,我们将此变量称为m
  2. 3也是一个动态数字,因此该解决方案也应适用于其他数字,我们将此变量称为n
  3. 子数组(谁评论谁)的选择应该是随机的,如果相同的10个人进行了2次不同的测试,则他们不应该一次又一次地评估同一个人。

简而言之:在m人中,每个人应准确地评论n人,并同时收到n条评论。

我已经能够在红宝石中找到一些非常有用的方法,例如combination,基本上让我做这样的事情:

[1,2,3,4,5,6,7,8,9,10].combination(2).to_a
=> [[1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [1, 8], [1, 9], [1, 10], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [2, 8], [2, 9], [2, 10], [3, 4], [3, 5], [3, 6], [3, 7], [3, 8], [3, 9], [3, 10], [4, 5], [4, 6], [4, 7], [4, 8], [4, 9], [4, 10], [5, 6], [5, 7], [5, 8], [5, 9], [5, 10], [6, 7], [6, 8], [6, 9], [6, 10], [7, 8], [7, 9], [7, 10], [8, 9], [8, 10], [9, 10]]

我还可以将其组合为3 (n)

irb(main):008:0> [1,2,3,4,5,6,7,8,9,10].combination(3).to_a
=> [[1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 2, 6], [1, 2, 7], [1, 2, 8], [1, 2, 9], [1, 2, 10], [1, 3, 4], [1, 3, 5], [1, 3, 6], [1, 3, 7], [1, 3, 8], [1, 3, 9], [1, 3, 10], [1, 4, 5], [1, 4, 6], [1, 4, 7], [1, 4, 8], [1, 4, 9], [1, 4, 10], [1, 5, 6], [1, 5, 7], [1, 5, 8], [1, 5, 9], [1, 5, 10], [1, 6, 7], [1, 6, 8], [1, 6, 9], [1, 6, 10], [1, 7, 8], [1, 7, 9], [1, 7, 10], [1, 8, 9], [1, 8, 10], [1, 9, 10], [2, 3, 4], [2, 3, 5], [2, 3, 6], [2, 3, 7], [2, 3, 8], [2, 3, 9], [2, 3, 10], [2, 4, 5], [2, 4, 6], [2, 4, 7], [2, 4, 8], [2, 4, 9], [2, 4, 10], [2, 5, 6], [2, 5, 7], [2, 5, 8], [2, 5, 9], [2, 5, 10], [2, 6, 7], [2, 6, 8], [2, 6, 9], [2, 6, 10], [2, 7, 8], [2, 7, 9], [2, 7, 10], [2, 8, 9], [2, 8, 10], [2, 9, 10], [3, 4, 5], [3, 4, 6], [3, 4, 7], [3, 4, 8], [3, 4, 9], [3, 4, 10], [3, 5, 6], [3, 5, 7], [3, 5, 8], [3, 5, 9], [3, 5, 10], [3, 6, 7], [3, 6, 8], [3, 6, 9], [3, 6, 10], [3, 7, 8], [3, 7, 9], [3, 7, 10], [3, 8, 9], [3, 8, 10], [3, 9, 10], [4, 5, 6], [4, 5, 7], [4, 5, 8], [4, 5, 9], [4, 5, 10], [4, 6, 7], [4, 6, 8], [4, 6, 9], [4, 6, 10], [4, 7, 8], [4, 7, 9], [4, 7, 10], [4, 8, 9], [4, 8, 10], [4, 9, 10], [5, 6, 7], [5, 6, 8], [5, 6, 9], [5, 6, 10], [5, 7, 8], [5, 7, 9], [5, 7, 10], [5, 8, 9], [5, 8, 10], [5, 9, 10], [6, 7, 8], [6, 7, 9], [6, 7, 10], [6, 8, 9], [6, 8, 10], [6, 9, 10], [7, 8, 9], [7, 8, 10], [7, 9, 10], [8, 9, 10]]

但是我不确定如何从这些子数组中挑选出确切的数量,以便每个人都从n个人中收到m条评论。也许有一些我不熟悉的与这类问题相关的名字。

谢谢

1 个答案:

答案 0 :(得分:2)

给出m号,构建“研究员”数组:

m = 10
fellows = m.times.map{ |i| i }
#=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

然后,每个人都评论下三个:

n = 3    
reviews = fellows.map.with_index.with_object({}) { |(f, i), h| h[f] = fellows.rotate(i)[1..n] }
#=> {0=>[1, 2, 3], 1=>[2, 3, 4], 2=>[3, 4, 5], 3=>[4, 5, 6], 4=>[5, 6, 7], 5=>[6, 7, 8], 6=>[7, 8, 9], 7=>[8, 9, 0], 8=>[9, 0, 1], 9=>[0, 1, 2]}

也许需要随机化吗?

reviews = fellows.shuffle!.map....