选择列表元素的随机组合,使得列表元素不会出现在多个选择中 (SQL)
我对如何实现一个小项目已经有点没有想法了。
我拥有的:
- 用户列表,包括他们的 ID 和姓名
我想要实现的目标:
- 我想将此列表中的每个用户与另一个用户合并,这样就不会将任何用户分配给多个用户,也不会将任何用户分配给她自己。 - 组合必须是随机的,并且必须考虑过去的组合
到目前为止我的想法:
- 我有以下信息:
用户(A、B、C、D)(实际用户数范围在 50 到 400 之间)
可能的组合:(AB、AC、AD、BC、BD、CD)
随机抽奖(1): (AB, CD)
随机抽奖(2): (AD, BC)
随机抽取(3):(AC,BD)
- 我能够使用用户表与其自身的联接来获得所有可能的组合。
- 我想我可以通过将抽奖存储在单独的表中来考虑以前的抽奖,并将可能的组合限制为不在此特殊表中的组合。
我不能做什么:
- 我不知道如何从可能的组合列表中随机抽奖,以便每个用户每次抽奖都只属于一个组合(例如不允许在同一抽奖中AB、AD)
- 我尝试使用 sql 或一点 php(也许是 javascript)
感谢您的帮助。
I'm running a bit out of ideas how to realize a small project.
What I have:
- a list of users including their ID and name
What I want to achieve:
- I want to combine each user on this list with another user such that no user is assigned to more than one user and no user is assigned to herself.
- The combination has to be random and has to take past combinations into account
My idea so far:
- I have this information:
User (A,B,C,D) (the actual number of users ranges between 50 and 400)
Possible combinations: (A-B,A-C,A-D,B-C,B-D,C-D)
Random draw(1): (A-B, C-D)
Random draw(2): (A-D, B-C)
Random draw(3): (A-C, B-D)
- I was able to get all possible combinations using a join of the user table with itself.
- I guess I can take previous draws into account by storing the draws in a separate table and limit the possible combinations to those that are not in this special table.
What I can't do:
- I don't know how to randomly draw from the list of possible combinations such that every user is part of only one combination per draw (e.g. A-B,A-D in the same draw is not allowed)
- I try to use sql or a bit php for this (maybe javascript)
Thanks for any help.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
一个简单的解决方案:
创建一个临时表,其中每个配对都有一行。循环遍历用户列表,跳过从 1 到空行数的随机数量的空行 -- 插入用户。
简单的解决方案 2:
给定 N 个用户。为每个用户分配一个从 1 到 N 的唯一随机数(从 1 到 N 的所有数字的集合中随机删除)。将每个用户从 1-N/2 与从 N/2+1 到 N 的用户配对。
An easy solution:
Create a temporary table with a row for each pairing. Loop over the list of users skipping a random number of empty rows from 1 to the number of empty rows -- insert user.
Easy solution number 2:
Given N users. Assign each user a unique random number from 1 to N (remove randomly from the set of all numbers from 1 to N). Pair each user with from 1-N/2 with user from N/2+1 to N.
解决办法就是问题“Bergr(s)表”,参见维基百科:http://en.wikipedia .org/wiki/Round-robin_tournament。
最新(最好)的解决方案来自Frončeka教授(Dalibor Froncek,美国明尼苏达大学教授)。
对于自定义解决方案,请查看解决方案 n ^ 2 表。
The solution is the problem "Bergr (s) table", see Wikipedia: http://en.wikipedia.org/wiki/Round-robin_tournament.
The latest (best) solution is from Professor Frončeka (Dalibor Froncek, a professor at the University of Minnesota in the US).
For custom solutions, look in the table of solutions n ^ 2.