中国开发网: 论坛: 程序员情感CBD: 贴子 886378
haitao: 摇奖程序的说明
摇奖程序的说明

公司年会活动,摇奖是众所瞩目的环节。最初是收集各人名片到一个盒子,再由人随手摸出。后来找了一个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。

我的blog:http://szhaitao.blog.hexun.com & http://www.hoolee.com/user/haitao
--以上均为泛泛之谈--
不尽牛人滚滚来,无边硬伤纷纷现 人在江湖(出来的),哪能不挨刀(总归是要的)
网络对话,歧义纷生;你以为明白了对方的话,其实呢?

您所在的IP暂时不能使用低版本的QQ,请到:http://im.qq.com/下载安装最新版的QQ,感谢您对QQ的支持和使用

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录