选择列表元素的随机组合,以便多个选择中不存在列表元素(SQL)

时间:2011-10-24 20:57:58

标签: javascript sql random combinations

我在想法如何实现一个小项目时运行了一些。

我拥有的东西:
- 用户列表,包括其ID和名称

我想要实现的目标:
- 我想将此列表中的每个用户与另一个用户组合在一起,这样就不会将用户分配给多个用户,也不会为自己分配任何用户。 - 组合必须是随机的,并且必须考虑过去的组合

到目前为止我的想法:
- 我有这个信息:

用户(A,B,C,D)(实际用户数在50到400之间)
可能的组合:(A-B,A-C,A-D,B-C,B-D,C-D)
随机抽取(1):( A-B,C-D)
随机抽取(2):( A-D,B-C)
随机抽取(3):( A-C,B-D)

  • 我能够使用用户表与自身的连接获得所有可能的组合。
  • 我想我可以通过将绘制存储在一个单独的表中来考虑先前的绘制,并将可能的组合限制为不在此特殊表中的那些。

我不能做的事:
- 我不知道如何从可能的组合列表中随机抽取,使得每个用户每次抽奖只有一个组合的一部分(例如,不允许A-B,同一抽签中的A-D)
- 我尝试使用sql或一点点php(也许是javascript)

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

一个简单的解决方案:

为每个配对创建一个临时表,其中包含一行。循环遍历用户列表,从1跳到空行数的空行 - 插入用户。

简易解决方案2:

给予N个用户。为每个用户分配一个从1到N的唯一随机数(从1到N的所有数字的集合中随机删除)。将每个用户与1-N / 2配对,用户从N / 2 + 1到N.

答案 1 :(得分:0)

解决方案是问题“Bergr(s)表”,请参阅维基百科:http://en.wikipedia.org/wiki/Round-robin_tournament

最新(最佳)解决方案来自Frončeka教授(Dalibor Froncek,美国明尼苏达大学教授)。

对于自定义解决方案,请查看解决方案表n ^ 2.