在线抽签、抽奖、摇号公平吗?随机原理与选择对照

年会抽奖前总有人问一句:这玩意儿不会被后台控制吧?对在线抽取工具来说,公平取决于两件事——随机数从哪儿来,以及结果是不是在动画之前就定了。本站的随机页面统一使用浏览器的加密级随机数接口,结果先算出来再放动画,动画只是回放。想直接开抽,用 随机抽签 抽奖器,全程在浏览器本地完成、名单不上传。

  • 随机数取自浏览器的加密级随机源(crypto),不是可预测的伪随机序列。
  • 结果在动画播放之前就已算出,转动和滚动只是回放,不存在「转到一半改结果」。
  • 五个页面语义不同:抽子集、按奖项分轮、跨轮次号码池、二维座位、点一个人。
  • 需要事后可验证时用种子模式:同一个种子必然复现同一个结果,可当场公示。
  • 名单、奖项、中奖结果都留在你的浏览器里,不上传、不写入任何服务器。

在线抽奖到底公不公平:两个决定性因素

判断一个在线抽取工具公不公平,只需要看两件事:随机数从哪里来,以及结果是在动画之前还是之后确定的。其余的界面花样都不影响结论。

一句话定义:公平的随机抽取,指每个候选被选中的概率严格符合设定的权重,且这个结果在展示之前就已确定、展示过程无法改变它。

第一件事:随机数的来源

本站的随机页面统一使用浏览器提供的加密级随机数接口。它由操作系统收集的熵产生,设计目标就是不可预测——这是它和普通伪随机数的本质区别:后者由确定算法从内部状态推算,观察足够多输出就有可能推断后续。在极少数不提供该接口的老旧环境下会回退到普通随机,日常抽奖场景下两者的公平性差别其实很小,但既然原生就有更强的接口,没有理由不用。

第二件事:结果先于动画

转盘转动、号码逐位滚动、名字快速闪过——这些都是回放,不是计算过程。结果在动画开始前就已经算完,动画只负责把它演出来。这一点很关键:如果实现成「转动过程中再决定停在哪」,那就存在一个可以插手的时机;先算后放则从结构上取消了这个时机。你可以观察到的一个佐证是,动画期间刷新页面并不会得到「另一个正在生成中的结果」。

还有一件事:名单没离开过你的电脑

这几个页面全程在浏览器本地运行,参与名单、奖项配置、中奖结果都不上传。这带来一个附带的公平性保证:服务端根本不知道你的名单里有谁,也就谈不上针对某个人做手脚。代价是刷新页面数据就没了,重要结果记得先导出。

五个随机页面分别对应什么场景

它们的随机内核是同一套,区别在于处理的语义不同。选对页面能省掉大量手工整理。

页面产出什么典型场景
随机抽签从名单里抽出一个子集抽取值日生、随机选题、小范围决定
抽奖器按奖项阶梯分轮产出中奖名单年会抽奖、活动多奖项发放
摇号器跨轮次演进的号码池与中签号多轮摇号、带弃号补摇的场景
随机座位表每人一个确定排号列号的座位矩阵教室排座、考场编排、宴会桌次
随机点名器一次点出一个或多个人课堂提问、会议随机发言

抽签与抽奖:要不要「奖项」这层语义

随机抽签只解决「从这些人里挑几个」,算完即止。抽奖器多了一层奖项语义:一等奖几名、二等奖几名,逐轮抽取、奖池随之收缩,还支持弃权补抽和重置。如果你的场景里有多个奖项等级,用抽奖器能省掉自己记录「谁已经中过」的麻烦。

摇号与抽签:状态是不是要跨轮次保留

摇号器的核心是一个可以持续演进的号码池:摇出的号出池、弃号可以退回、上一轮可以撤销。这和「一次性抽出一批号码然后结束」是不同的需求。判断标准很简单——如果抽完之后还可能回头调整,用摇号器;如果一锤子买卖,用随机抽签。

座位表:产出的是位置而不是分组

随机座位表产出的是「几排几列」的二维矩阵,每个人有确定的排号和列号,这和随机分组(只管分成几组、组内无位置)是两回事。它额外支持锁定某些座位、前排优先、禁止相邻这三类约束,约束按尽力而为处理,冲突会如实列出来。

抽奖不重复怎么保证:无放回与奖池状态

「不重复」在实现上就是无放回抽取:每抽出一个候选就把它从池子里移走,后续抽取只在剩余候选中进行。听起来简单,实际用起来有几个容易踩的点。

重名和重复行会被当成两个人

名单里如果同一个名字出现了两次,工具会把它们当作两个独立条目——这是有意的,因为确实存在同名的不同人。但它的副作用是:不小心复制粘贴出的重复行,会让那个人的中奖概率翻倍。抽之前先用 文本去重 过一遍名单,是个便宜的保险。

权重和不重复可以同时用

在名称后加权重后缀可以让某些条目更容易被抽中,权重范围 1 到 99。加权与无放回并不冲突:权重决定「这一轮谁更可能被抽中」,无放回决定「抽中之后不再参与」。公开场合使用加权时,务必提前公示规则——事后才说明某些人权重更高,比不加权更容易引发争议。

弃权补抽:把状态改对,而不是重抽一轮

中奖者不在现场需要补抽时,正确做法是用补抽功能把那个人替换掉,而不是整轮重抽。整轮重抽会让已经宣布的其他中奖者也发生变化,现场解释成本极高。抽奖器把奖池做成显式的状态机,就是为了让这类中途调整有确定的语义,而不是靠主持人临场发挥。

每人各抽一次、还不能抽到自己:错排

交换礼物是无放回抽取的极端形式:不是抽出一个子集,而是让每个人都抽到一个人,且谁也不能抽到自己——数学上叫错排(derangement)。 交换礼物配对 处理的就是这类约束,和抽奖器的差别在于失败模式:抽奖抽不出来只是候选不够,而错排会因为规则互相冲突而根本无解——比如把「同一家人不互抽」开着,而某个家庭的人数超过了总人数的一半,那这些人凑不齐足够的组外收礼人,怎么排都不成立。所以这类工具的正确做法不是「抽到自己就重抽一次」碰运气(人一多几乎必然要重抽好几轮),而是先判定这套规则有没有解,无解就直接指出是哪一条卡住了。

抽的是内容不是人:牌堆模型

无放回还有另一种常见用法——抽的不是人而是内容。 随机话题卡 就用了牌堆模型:进页面时把当前筛选范围内的话题洗成一副牌,之后按顺序发牌,所以同一轮里不会重复出题,整副牌发完才自动重新洗牌,并且重洗后的第一张不会等于你刚看到的那张。和抽奖器的奖池状态机相比,牌堆的语义更简单:不需要记「谁已经中过」,取牌本身就是无放回的;筛选条件一改就整副重洗。要抽的对象是一批固定内容而不是一份名单时,牌堆比逐次排除更好维护。

抽的是位置:对阵表里的轮空抽不平

还有一种抽法既不是抽子集也不是抽内容,而是把整份名单无放回地洗进一组固定位置——比赛抽签就是这样。 淘汰赛对阵表 把每个人洗进对阵图的表位,均匀洗牌保证谁落在哪一格的机会相同,但这里有一个抽奖没有的问题:表位数只能是 8、16、32 这种 2 的整数次幂,人数对不上时多出来的位置就是轮空,拿到轮空的人少打一场。这一条不是实现缺陷,是单败赛制自带的性质,任何工具都消不掉,能做的只有两件事——保证不会出现一场比赛两边都轮空(那是一场没人打的空场),以及把轮空给谁这件事的规则提前讲明白:随机分配更像抓阄,按种子位次给高种子则是赛事惯例。规则事先公开,比事后解释「为什么他能轮空」有用得多。

反过来:每次都放回,重复写一行就是加权

上面几种都是无放回,但很多场合要的恰恰是有放回——每一次都从完整的池子里重新抽,同一个结果可以连着出现。掷骰子就是这个模型, 自定义骰子 把骰面换成你自己写的内容之后仍然如此:每掷一次都是独立的,连着三次掷出「大冒险」既不是坏了也不是没洗牌,而是有放回抽取的正常表现——只有在无放回的场景里,重复才算异常。这两种模型对「重复行」的态度正好相反:名单里多写一行是需要用去重清掉的事故,骰面上多写一行则是表达权重的正规手段——同一句话写两遍就占两个面,掷中概率正好翻倍,用不着填权重数字,数一眼行数就知道概率。判断用哪种很简单:抽完之后这个候选还该不该参与下一次,答的是「不该」就用无放回的抽签抽奖,答的是「该」就用骰子这类有放回的页面。

重复行加权胜在直观,短处也很明显:它只能表达整数倍,而且要凑出 7:3 得写十行。要把概率精确定到某个比例,就该让权重本身变成可见的输入, 加权抽签 做的正是这件事——每项一个 1~99 的权重,页面同步显示它到底是百分之几,也可以反过来直接填「60% / 30% / 10%」由工具换算权重,并如实告诉你整数权重实际能做到多少。更要紧的是它把「权重有没有生效」这件事交还给你验证:一键连抽一万次,把理论概率和实际频次并排列出来,你不必相信任何人的说法,自己数一遍就知道。这也是本文一直在讲的那条线——公平要能被验证,不等概率同样要能被验证。

要让人信服:种子模式与当场可验证

技术上公平和让人相信公平是两回事。后者需要的是可验证性——让任何人事后都能自己重跑一遍,得到相同结果。

种子模式的原理

开启种子模式后,随机过程由一个指定的种子决定:同一个种子加同一份名单,必然产生完全相同的结果。抽签和抽奖两个页面共用同一份种子实现,所以拿抽签页的种子去抽奖页验证不会对不上——这个一致性是刻意保证的,两处各写一份必然会漂移。

怎么用它做当场公示

可行的流程是:先确定并锁定参与名单,再当众产生种子(用当天日期加上现场随机点一个人报的数字是常见做法),把种子写在大屏上,然后开抽。结束后把名单和种子一起公布,任何人都能在自己的设备上重跑验证。

顺序很重要:种子必须在名单确定之后才产生。因为可复现意味着「知道种子和名单就能提前算出结果」——先定种子再定名单,等于给了操作空间。这一点在设计公示流程时经常被忽略。

什么时候不该用种子模式

日常的小事决策、课堂点名不需要种子,默认的加密级随机更省事也更不可预测。种子模式的价值只在「需要事后向他人证明」的场景,为了可验证性它牺牲了不可预测性,两者不可兼得。

实操建议:名单怎么准备、争议怎么避免

绝大多数抽奖争议不是出在随机算法上,而是出在名单和流程上。抽之前花两分钟做下面几件事,比解释十遍算法管用。

名单先清洗再粘贴

从报名表导出的名单常带着空行、多余空格、序号前缀。先过一遍 去空行空格 文本去重,再确认工具解析出的条目数与实际人数一致——这个数字对不上是最常见的问题来源,而且它在抽完之后才被发现的话,基本只能重来。

抽前把规则说完整

需要说清楚的通常有四条:一共几个奖项各几名、是否允许一人中多个奖、不在场是否算弃权、弃权后怎么补。这些规则应该在开抽前讲完,而不是在出现具体情况之后再定——后者无论怎么处理都会显得偏袒。

抽后立刻导出存档

中奖名单只存在于当前页面,刷新即消失。抽完第一件事是导出保存,而不是先去发奖。这一条看起来琐碎,但页面被误关导致名单丢失、需要重抽的情况并不罕见,而重抽必然引发对第一次结果的质疑。

小事决策不必上抽奖器

二选一、点个人、随便挑个数,用 在线抛硬币随机点名器 幸运大转盘 更快;纠结的只是「要不要做这件事」,用 是否决定器 直接摇一个是或否,还能记住你为同一个问题问过几次;几个人分摊一件事(谁请客、谁值日、谁去搬东西),用 抽长短签 让每人各抽一支,抽到短签的中——这类场合最常被问的「先抽后抽谁吃亏」在那一页有逐位算式:只要不边抽边公布,每一位的事前概率都是短签数÷签数,完全相同。抽奖器的奖池状态机是为多奖项、多轮次场景准备的,用在只抽一个人的场合属于杀鸡用牛刀。

「怎么老是我」不是错觉,但也不是偏心

反复给同一群人分摊小事时,最常听到的抱怨是「怎么又是我」。这句话在数学上有据可查:纯随机每一趟都独立,某人这趟中签后紧接着下一趟又中的概率就是 1/n,5 个人的办公室里等于每五次就会出现一次「连着两趟都是你」;十趟下来,任意指定一个人跑三趟及以上的概率约 32%,3 个人的小组更高达约 70%。所以「连中」是纯随机的正常输出,不是工具偏心,也不能靠重抽消除。

真要让长期分摊看起来均匀,只有一条路:放弃「每趟独立」,把历史记录折进权重——这已经不是纯随机,而是有状态的加权抽取,必须在抽之前讲明白,否则同样会被质疑。 谁去跑腿 就是按这个思路做的:它在本机记一本账,最近跑得多的人这趟权重按指数衰减降下来,但留 5% 的保底、永远不会归零,所以既压掉了连中,又保住了悬念;账本在页面上公开可查,谁最近去过几次一目了然。想彻底不要随机、按固定顺序轮流,那已经是排班而不是抽签,用 值日轮换表 排一整期更合适。

常见问题

在线抽奖器会不会被后台操控结果
就本站的实现而言不会,原因有两条可验证的设计:一是随机数直接取自浏览器提供的加密级随机接口,页面本身不生成、不干预这个数;二是结果在动画开始之前就已经计算完成,转盘转动、号码滚动都只是把已定的结果回放出来,不存在「转的过程中根据情况改结果」的时机。加上整个过程在你自己的浏览器里完成、不联网,服务端连参与名单都拿不到,也就无从操控。
加密级随机和普通随机有什么区别
普通随机数由一个确定的算法从内部状态推算出来,观察到足够多的输出就有可能推断后续结果,它的设计目标是「看起来均匀」而不是「不可预测」。加密级随机数由操作系统收集的熵产生,设计目标就是不可预测,用于生成密钥等场景。日常抽奖用普通随机其实也够,但既然浏览器原生就提供了更强的接口,没有理由不用。
抽奖怎么保证不抽到同一个人两次
用无放回抽取:每抽出一个就把它从池子里移走,后续轮次不再参与。抽奖器维护的是一个跨轮次的奖池状态,一等奖抽完之后二等奖只在剩下的人里抽。需要允许重复中奖时(比如每轮独立的场景)可以切换成有放回模式。要注意的是,名单里如果本来就有重名或重复行,工具会把它们当作独立条目处理——同一个人写了两遍,中奖概率就是别人的两倍,这属于名单问题不是抽取问题。
摇号器和随机抽签有什么不一样
摇号器面向号码,维护的是一个可持续演进的号码池:摇出去的号出池、弃号可以退回池里、上一轮还能撤销,适合多轮次进行的摇号场景。随机抽签面向名单条目,一次抽出一个子集,算完即止。如果你要做的是「从 1 到 500 里逐轮摇出中签号码,中间还可能有人放弃资格」,用摇号器;如果只是「从一份名单里随机挑三个人」,用随机抽签更直接。
怎么让参与者相信抽奖结果没有作弊
用种子模式并当场公示。开启后随机过程由一个你指定的种子决定,同一个种子必然产生同一个结果。做法是抽奖前当众确定种子(比如用当天的日期加上现场某个人报的数字),记录在大屏上,抽完之后任何人都可以用同样的名单和种子在自己手机上重跑一遍,得到完全相同的结果。这比口头保证有力得多。注意种子模式的可复现性本身就意味着「知道种子就能提前算出结果」,所以种子必须在名单确定之后才产生。
名单里可以给某些人更高的中奖概率吗
可以,在名称后面加权重后缀即可,权重范围是 1 到 99,不写默认为 1。权重 3 的条目被抽中的概率是权重 1 的三倍。这个功能在「按业绩分配抽奖机会」「按参与次数加权」这类场景有用,但用于公开抽奖时应当提前公示权重规则,否则会引发争议。另外权重解析规则在本站几个随机页面之间是统一的,同一份名单粘到任意一个页面,解析结果完全一致。
随机座位表能保证某些人不挨着坐吗
能尽力而为,但不做承诺。座位表支持锁定指定座位、前排优先、禁止相邻这三类约束。约束越多、座位越紧张,就越可能出现无法同时满足的情况——这时工具会如实把冲突列出来,而不是悄悄忽略某条约束或陷入死循环。看到冲突提示,通常意味着需要放宽某个约束或调整座位数。
参与名单会被上传或保存吗
不会。名单、奖项设置、中奖结果都只存在于你当前浏览器的页面里,不上传服务器、不写入任何远程存储。这也意味着刷新或关闭页面后数据就没了——重要的中奖名单请在抽完后先导出保存。

先按场景选对页面:抽子集用 随机抽签,分奖项用 抽奖器,多轮号码用 摇号器,排座位用 随机座位表,课堂点人用 随机点名器,排比赛出场顺序用 随机排序器,分红蓝两队开打用 对战分边器(它把「谁和谁一边」也纳入可复现范围:同一份名单配同一个种子,两边阵容在任何设备都一样) ,排一整学期的班级值日表、宿舍卫生轮值表用 值日表生成器(它把种子从「一次抽取」推到「一整张长期轮值表」:同种子同名单排出同一张表,且每人总次数相差不超过 1,公示后谁都能自己复算)。公开场合抽取,抽前当众定好种子,抽后导出名单存档——这两步能省掉绝大部分事后争议。

参考资料

延伸阅读

本文由「小鹿tools」整理,更新于 2026-08。如发现信息过期或有误,欢迎反馈。