著名视频网站 B 站抽奖,十个获奖者里面可能只有 1 个不是大会员,王思聪发起的抽奖 100 个获奖者里面可能只有一个不是美女,连最基本的性别都无法做到公平。那么该如何实现一个公平的抽奖呢?
作为一个绝对的中奖绝缘体,为了知道为什么抽不中自己,也花了一定的时间学习抽奖的原理。发现实现一个公平公正的抽奖其实并不容易。
网络直播抽奖往往采用刷屏截图的方式,能调动活跃的气氛,但并不能实现抽奖结果复现;也有一些博主采用确定抽奖范围排序 + 随机数的方式,比如 100 个人里面抽一个就将一百人进行一定方式的排序,再生成一个 0-100 的随机数,认为这个数所对应的人就是获奖者,可是这样也没有办法确定随机数是否真的随机,无法确定随机数的生成方式,参与者更无法验证抽奖是否真实,就算发起方发一个截图,也无法证明抽奖的公平性。
使用随机数可以确保每个参与者在抽奖中具有相同的机会。每个参与者的选项都是等价的,而且每个选项都有相同的机会被选中。使用随机数可以确保这种公平性。
同时,使用随机数可以增加抽奖的趣味性和刺激性。每个参与者都不知道自己是否会被选中,这增加了抽奖的刺激性和悬念感。
在抽奖过程中,为了确保随机性,需要使用高质量的随机数生成器。一个好的随机数生成器应该是无偏的、独立的、均匀的和具有周期性的。如果生成的随机数不是高质量的,可能会导致抽奖结果不公平或预测可能性很高。
我们都知道,计算机是无法生成真正的随机数,所有计算机随机数均为伪随机。于是我采用某个确定时间节点之后的第一个比特币区块的块头哈希值作为随机数,我无法挖矿也就无法生成块头,更不可能操控随机数生成的结果。抽奖的基本算法采用哈希算法
下面是实现的具体过程:
1. 将参与者的 ID 统计出来
2. 确定固定时间,比如东八区 2023 年 4 月 22 日 13:00,取此时间以后的第一个比特币区块块头哈希值为随机数
3. 将每个人的 ID 分别于此随机数一起取哈希值
4. 把求得的哈希值排序,根据中奖人数确定前几名为获奖者
我并不会写代码,因此我让 ChatGPT 帮我编写了此代码
简单安装完所需要的库以后就可以执行了,参与者 ID 可以是 B 站 UID,也可以是手机号,还可以直接是人名,下面我用 QQ 号做演示。将用到下面两个网站把群友的 QQ 号导出
导出以后就得到了这一个全部由 QQ 号组成的.txt 文本。然后根据确定时间打开区块链浏览器,找到所需要的区块的块头哈希值。把此哈希值和.txt 文档名填入上面的程序之中,最后运行此程序,第一名即为获奖者。
所用到的程序我将会开源,并在评论区发出