[阅读: 360] 2011-02-14 05:47:41
摇奖程序的说明
公司年会活动,摇奖是众所瞩目的环节。最初是收集各人名片到一个盒子,再由人随手摸出。后来找了一个flash程序,由它随机产生,但是它显示的骰子其实与人员工号无关的。于是从前年开始,自己写了一个摇奖程序。
到今年已经是第2次使用了。去年的结果实在有点戏剧性,使得我这个编写者也瞠目结舌。今年按总导演的要求,加上中奖者照片的显示功能,其它机制基本没变。结果也是有一点戏剧性。
因此,不得不及时抽时间写一个说明。
摇奖程序,最关键的机制是随机:正好我一直对安全、随机有点兴趣(记得第一篇投稿的豆腐干就是关于对basic程序的随机性改进,好像89年时候,稿费15元),所以才敢接下这个活。
首先,所有参与摇奖者是一个文本名单,一人占一行,至于里面怎么写的,其实与随机无关。
每次摇(喊“开始”之后)之前,先把这个文本行(比如300行)里删掉本次已经中奖的(比如5行),结果是295行。
然后,进行一个随机洗牌:
for i=0 to 295-1
交换 第i行和rand(295)行;
这个过程可以进行几次;
接着就是开始闪动名单了:每次产生一个x=rand(295),把第x行的文字显示出来
喊“停止”时,再产生一个x=rand(295),把第x行的文字作为中奖者!
为了显示照片,这个时候,程序才去判断第x行的文字,把里面的数字找出来,再与照片目录里的文件名比较,含相同数字的照片才会被显示。如果没有符合的照片文件,则显示一个“没有照片”的缺省图片。如果此缺省图片也不存在,则不显示。
再说rand(x)的随机性,它是最常用的伪随机算法:线性同余
说它“伪”是因为它使用了40亿次后,结果序列会重复。但是,我们的摇奖一百年也不会使用(闪)满40亿次。所以,应该是足够随机的了。
出现的戏剧性,可能只能说是真随机在小次数下反而是无法做到按部门、按桌、按以前的中奖情况进行平均分配了。
下面是摇奖程序,大家可以有空试一试:
点击浏览该文件
为了增加公平和戏剧性,倒是可以由每个摇奖者先默记一个数字x(3-10之间),即每摇出一次,在大家惊叹后宣布取消,直到达到第x次了,才公开这个x,并确定这次结果才有效!这样可能会比较浪费时间,但是戏剧性应该会强很多,而且也进一步杜绝的任何作弊的可能:因为作弊者(如果有的话)也无法知道摇奖者临时默记并写到字条的x。