先说那天晚上发生了什么
凌晨一点四十,我在客厅地板上铺了一张旧报纸,把一台自己写的摇奖器点了第十二遍。屏幕上是 1 到 49 的球,滚了大概三秒,停在了 17 号。我盯着它看了很久,然后翻出笔记本,写下第一行字:「为什么是 17,不是别的?」你看,这就是我最近的状态——困惑,很多问题没有答案。我朋友老陈,住南京鼓楼区,他在电话里笑我:「顾南,你半夜研究这个,是准备去澳门吗?」我说不是,我只是想弄明白,一个 1-49 的摇奖器,到底在「摇」什么。
我们从头说。模拟摇奖器1-49,最朴素的定义就是:从 1 到 49 这四十九个数字里,按某种规则抽出一个或一组。听上去简单得过分,对吧?但你只要动手写一遍,问题就开始冒出来。比如,我 8 月 3 号那天用两种方式各跑了一千次:第一种直接用 全彩助手v1.25.9 那类工具生成的随机结果,第二种是我自己用时间戳做种子手写的循环。结果呢?第一种里 7 这个数字出现了 31 次,第二种里出现了 19 次。你告诉我,哪个「更随机」?我答不上来。我列了一张表,横轴 1 到 49,纵轴出现频次,画到第 33 格的时候笔尖把纸戳破了——不是气的,是困的。
还有一个更烦人的问题:随机性到底是不是一种「感觉」。有天下午我请隔壁的李阿姨帮我按停止键,她按出了 49;第二天她自己又按了一次,还是 49。她特得意,说这机器「认人」。我知道这是巧合,可是当我连续三次看到 49 出现在前五位的时候,我居然也怀疑了一下。我在笔记本上写了句:「人对重复的敏感,远超过对均匀的信任。」这句话我暂时信一半。
我不打算把这个页面写成教学。我更想把它当成一份档案:写下我试过的方法、遇到的坑、以及我还没解决的问题。比如种子怎么选、要不要洗牌、49 个数字的排列到底该用 Fisher-Yates 还是直接随机索引、展示的时候要不要做滚动动画(我做了,因为好看,虽然它不影响概率)。这些问题我目前只解决了一半,剩下的一半还在纸上打转。如果你也在做类似的东西,欢迎从旁边的列表里看看我都翻过哪些资料,有些链接纯粹是那天搜索时顺手存下的,比如 cgw每日大瓜赛,我承认点进去的时候没抱什么期待。
说个让我有点上头的细节:为了让球滚起来好看,我给每个球做了独立的缓动动画,49 个球一共 49 条时间线,用 requestAnimationFrame 驱动,最后一帧硬切到结果。有天我把动画时长从 1200 毫秒改成 2800 毫秒,结果整个页面卡成了幻灯片。后来我发现是我在每个球上重复创建了计时器,49 个计时器同时跑,浏览器直接投降。我把代码贴给老陈看,他回我三个字:「你活该。」好吧,我活该。
我还有一个观点,说得直白一点:市面上很多所谓的摇奖器,本质上只是「好看的随机数生成器」。它们不需要公平,只需要让你觉得公平。我不认为这是骗人,因为大多数人要的就是那个「感觉」。但我自己写这个的时候,刻意没有加任何「预测」「趋势」「热号冷号」的功能——不是我清高,是我知道那些东西在我这里没有依据,加了心虚。顺便,如果你在找类似参考,挑码神器2026 那种类型我也翻过几眼,看完更确定自己的想法。
还有一个我没解决的问题:四十九选六,和四十九选一,是完全不同的两件事,可很多人(包括我自己在最初)会把它们混在一起谈。选一的时候每个数字概率是 1/49,选六并且不重复的时候,组合数是 13983816。我第一次算出来的那天,拿计算器按了两遍,又用笔验了一遍,才敢写下来。你看,这就是我最近的样子:一个数字都要确认三次。也许这不算什么毛病。