星期一, 十一月 16, 2015

如何为一场大赛公正抽签分组

上周末我组织了一场羽毛球比赛,比赛有将近 50 人报名,合计101场比赛。赛前为了公平起见,我想采用现场抽签以避免事前操纵比赛的嫌疑。为了准备这个抽签,我花了几个小时时间造了一个 Excel 表格。现场抽签的算法是这样的。Sheet2 中放了参赛选手,按项目分组。sheet3 中每个比赛场次的选手对应 Sheet2 中的一个具体 cell。这样一旦 sheet2 中的选手按抽签排序,具体 cell 中的名字改变,sheet3 中的具体场次的选手也会发生改变。

算法本身没问题,愿望也是美好的,然而真正具体应用时就出了大麻烦。这是由三个问题导致的:有选手缺席、迟到和抓错签。因此后面的比赛场次根本就无法进行。这样做的另外一个问题是只有安排者知道场次,选手只能干等,全程侯场,不能自主安排时间。这显然是由于我从来没有组织经验造成的。如此至少现场还应该有一台打印机,把比赛进程打印出来公示。

那么能否有简单的方法在报名结束时就做好公平的抽签呢?答案当然是肯定的。以下就是一个算法。
  1. 赛前公布若干随机数种子和分组抽签程序及使用方法。
  2. 抽签程序加密,hash,供下载。加密程序可以加两个小把戏,一是加盐,比如shuffle若干次,种子再加固定数等。另外文件也可以加一些盐,比如文件中可以加一个注释行,包含随机长度的随机字串。这样即使通用的算法或反复使用的程序,大家也不好通过 hash 码猜具体文件中是什么内容。
  3. 参赛选手按报名顺序公示。
  4. 登记报名者和提程序者需要是两个不同的人。
  5. 报名截止,投票选随机数种子。
  6. 运行程序,产生分组并公示。
由此参赛选手就可以在报名结束时了解进程。且分组按事先约定可验证,因而公平公正,童叟无欺。

没有评论: