电子抽奖的随机性

抽奖自去年开始就从摸名片改为电子抽奖,为了公平,找了一个外部的程序,都没注册的。但是不大好用:编辑、设置麻烦,奖等顺序无法调整,开错一人无法撤销,如中奖人不在,无法取消重新抽一个,最后的安慰奖无法临时决定人数。

打算自己搞一个了:能预先生成随机列表滚动(现在这个滚动的只是flash动画,好像与名单无关)或单个跳变显示;能决定某奖等的哪几个是谁来开;某奖等的中奖者能否参与后续奖等;开错了可以撤销(中奖无效,名单退回可继续抽奖。但是必须留下日志)。

只是界面会呆板很多。

另一个非技术而是规则的改进建议:以前中过奖的不再参与。

因为多年下来,发现有些人多次中奖,有些人一届也没有中过!

这一次也是有几个巧合之处:有个因项目晚来的中了!他受到特别的表扬;有个办事处的中奖很普遍,但是其中有个人却从来没中过,晚会前正好坐一起抱怨过,这次中了特等奖!

最怕就是自己名列高奖!——幸好这几年还是从来未中过。。。。。。。。

线性同余的伪随机产生算法应该是比较随机的了(虽然是一个2G的固定列表里某一个作为起点的序列,但是对于小型应用是足够随机了),不过国外有人根据时间抓到这个起点,则后续的“随机数”就是可以预测的了!对于这一点,可以简单改进予以避免(不过方法不能被外部了解,否则还是能预测后续的序列)。

还有一个问题时,随机循环的次数很少时(一般的抽奖只能乱转几十秒种),不同人的被选中(虽然不是开奖人停止的时候)的次数差距是很大的,大约有几倍的差距!循环的次数多了,才能慢慢变得均匀。

不过这应该还是公平的,因为一次循环里,谁被选中多,还是随机的!

为了彻底打破这个顾虑,干脆事前再把名单打乱一次,这样肯定公平了!!

电子抽奖的随机性c

count为总选中次数,max为选中次数最多的序号,min为选中次数最少的序号

RandTestResult: count=1000 max=19 min=3 ——6倍!!
RandTestResult: count=2000 max=29 min=10 ——3倍!
RandTestResult: count=3000 max=43 min=14
RandTestResult: count=4000 max=50 min=18
RandTestResult: count=5000 max=60 min=27
RandTestResult: count=6000 max=73 min=39
RandTestResult: count=7000 max=85 min=45
RandTestResult: count=8000 max=94 min=54
RandTestResult: count=9000 max=102 min=61
RandTestResult: count=10000 max=117 min=70
RandTestResult: count=11000 max=124 min=78
RandTestResult: count=12000 max=136 min=86
RandTestResult: count=13000 max=145 min=90
RandTestResult: count=14000 max=158 min=100
RandTestResult: count=15000 max=163 min=107
RandTestResult: count=16000 max=170 min=112
RandTestResult: count=17000 max=180 min=116
RandTestResult: count=18000 max=193 min=124
RandTestResult: count=19000 max=201 min=135
RandTestResult: count=20000 max=208 min=142
RandTestResult: count=21000 max=217 min=151
RandTestResult: count=22000 max=228 min=159
RandTestResult: count=23000 max=235 min=169
RandTestResult: count=24000 max=251 min=176
RandTestResult: count=25000 max=256 min=184
RandTestResult: count=26000 max=268 min=190
RandTestResult: count=27000 max=276 min=199
RandTestResult: count=28000 max=287 min=208
RandTestResult: count=29000 max=294 min=218
RandTestResult: count=30000 max=309 min=226
RandTestResult: count=31000 max=323 min=233
RandTestResult: count=32000 max=330 min=241
RandTestResult: count=33000 max=337 min=246
RandTestResult: count=34000 max=346 min=251
RandTestResult: count=35000 max=358 min=264
RandTestResult: count=36000 max=371 min=272
RandTestResult: count=37000 max=385 min=278
RandTestResult: count=38000 max=393 min=286
RandTestResult: count=39000 max=396 min=293
RandTestResult: count=40000 max=410 min=299
RandTestResult: count=41000 max=421 min=307
RandTestResult: count=42000 max=431 min=314
RandTestResult: count=43000 max=438 min=325
RandTestResult: count=44000 max=452 min=331
RandTestResult: count=45000 max=463 min=337
RandTestResult: count=46000 max=468 min=348
RandTestResult: count=47000 max=474 min=357
RandTestResult: count=48000 max=480 min=366
RandTestResult: count=49000 max=489 min=378
RandTestResult: count=50000 max=496 min=389
RandTestResult: count=51000 max=503 min=399
RandTestResult: count=51320 max=507 min=403