一般的抽奖程序是怎么写的?

2021-11-09 22:37:55 +08:00
 kikione

如题。

4716 次点击
所在节点    程序员
51 条回复
jptx
2021-11-10 09:59:04 +08:00
先准备员工姓名工号列表,作为第一个列表,如果特等奖有内定,则把特等奖那个员工从第一个列表中摘出来单独放一个列表,如果有一等奖内定,则把一等奖那个员工也从列表中摘出来单独放一个列表,以此类推。如果有员工黑名单或者高管或者避嫌不想让中奖的人,则把这些人从第一个列表中移除。
现在可供抽奖的员工列表准备完毕了,再准备一个列表(员工姓名、工号、头像)供界面滚动,这个列表包含公司全体员工,让每个人(包括老板)都可以在界面上滚动,这个列表是死的,不论是否中过奖,不论是否是内定,都在里面滚动。
下面开始抽奖,三等奖和二等奖抽的时候,可以使用洗牌算法进行抽取,洗牌算法随便百度就有现成的代码,抽到哪些人,就把他们从第一个列表中移除,单独放入中奖列表,记录下这些人的中奖信息。抽一等奖时要注意,一定要先拉取内定人员列表,再从剩下的列表中抽取,如果一次抽取很多人,这些人在界面上的排序要随机,不要连着。
raysonlu
2021-11-10 10:00:33 +08:00
之前参与过一次讨论,确实不只是 Ramdom 那么简单。主要是不能确定抽奖总次数(总人数)。
一般简单的需求只是提出了中奖概率:一等奖中奖率 1%,二等 3%,三等 5%,为了方便讨论,姑且再简单化每个奖项奖品数量为 1 。
然后大多数人一上来的写法就是 random1~100 ,然后得出指定的一个或者多个的数,来做中奖判断。
实际上这种简单模型,只遵循了理论上的中奖率,没有符合到实际需求。因为中奖变得“先到先得”更为重要了(可以写个模拟抽奖 demo 测试一下),但实际上一场抽奖活动更多的是希望吸引更多的人流,并不想活动开了半天大奖全部抽完。
所以当时我盲猜两种做法:1 极度调低实际的中奖率,配合活动结束时间稍微调整让奖品都能送出; 2 也是要配合活动时间定时定量动态调整奖品中奖率。
2kCS5c0b0ITXE5k2
2021-11-10 10:05:42 +08:00
我用的是 Alias Method. 运行一年多 基本上的结果都和设定的概率趋同.
rekulas
2021-11-10 10:11:42 +08:00
@sadfQED2 没用,获取声波就大有可操作的地方,毕竟人脑也不可能判断你取得参数是否正确。要想做到真正公平,就必须流程公开人人可计算,例如遵循密码学承诺的开奖方式
stroh
2021-11-10 10:17:04 +08:00
彩票不是随机的,如果真随机早就做不下去了
necodba
2021-11-10 10:18:33 +08:00
我觉得还是要看功能吧,之前有一个什么星 yun 抽奖的,你看它实现的功能再定制你自己需要的功能啊
HQKM
2021-11-10 10:18:59 +08:00
时间戳做随机种子,还要策划要求的保底功能,欧皇靠概率防不住。
y0bcn
2021-11-10 10:20:04 +08:00
大一的时候给学校的活动做过大屏抽奖,主要是根据场地大小预估场地人数,确保性能跟得上
提供一个二维码链接供用户扫码输入信息,输入的信息会通过 websocket 传到浏览器端,采用 websocket 的主要原因是当时的服务器宽带太小,怕人数多了太卡,等于把大流量的下载变成分散的小流量。
浏览器端设置一个 strat/stop 方法,控制滚动
滚动很简单,就是取随机数去改变文字,实测在 70ms 左右效果就不错

同时可以提供一个控制端,通过 websocket 控制大屏幕的开始或暂停
当然如果想省事,直接设置快捷键,后台工作人员根据主持人的指示 start/stop 即可

这是大屏抽奖,中奖率啥的没考虑,因为本身是各奖项数量有限,没有必要去考虑,不过有一个去重,即中奖后会把他从名单拿掉,防止万一重复中奖造成他人眼红。。
Chad0000
2021-11-10 10:22:01 +08:00
如果参与人数比较多同时想控制出奖均匀,可以采取定点放奖。这样某个时间一到,第一个抽的人就拿走相应的奖。
Chad0000
2021-11-10 10:23:10 +08:00
甚至由运营人员点按钮,人工放大奖。点了大奖马上就放池子里,第一个抽者获得
securityCoding
2021-11-10 10:24:39 +08:00
@stroh 彩票是官营博彩,真随机没办法控制
Immortal
2021-11-10 10:25:33 +08:00
把中奖名额设置可以指定 然后问问老板意思
geekvcn
2021-11-10 10:30:41 +08:00
return "谢谢参与"

网页滚动:
随机姓名 随机号码 刚刚中了 XXX ,运气爆表!!!
...
kop1989
2021-11-10 10:40:48 +08:00
1 、黑名单、白名单。
2 、时间做种子,如果系统有其他业务的话,可以加一些其他业务的无关信息。(比如昨天某某日志的条数)
3 、根据业务需要增加保底和概率回归(因为抽奖都是有限次的,所以有可能会导致当场抽奖的概率和理论概率有很大偏差)
stroh
2021-11-10 11:13:01 +08:00
@securityCoding 是的,总得有人吃肉,有人喝汤,有人提供案板,有人自愿躺在上面
SmiteChow
2021-11-10 14:19:18 +08:00
一般内定,然后整个滚动的假象。
soupu626
2021-11-10 14:27:21 +08:00
每个用户能拿什么奖,事先打好标,一般一个 int 就够了,然后实际抽的时候在对应的人群里选人出来就行
2i2Re2PLMaDnghL
2021-11-10 14:53:33 +08:00
@jorneyr 不能不怀疑,有些起哄的人写了过生日的人的名字,属于拔高中奖率了
2i2Re2PLMaDnghL
2021-11-10 14:54:35 +08:00
@stroh ?你是不是不懂彩票这东西越随机越能赚钱?
mengyx
2021-11-10 15:14:31 +08:00
应该用一个难以控制,但是容易验证的值作为 seed
比如说,提前约定未来某天的 股指收盘点数

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/814273

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX