使用方法
- 在「一次抽几个」里填 1(示例值,也是页面默认值),允许 1~50 的整数。填 1 就是最常见的用法:抽一个号码出来点名。
- 选「抽取方式」。「允许重复」是默认项,每抽一次都在完整的 1~100 里取数;「不重复」适合发奖,抽过的号码自动从候选池里移除。
- 点「生成」,或在输入框里按 Enter。结果区立即给出号码,并标注当前的条件(范围、是否重复、个数)。打开页面时结果区已经有一组演示输出(42,数值仅作演示)。
- 「载入示例」把条件恢复成默认值并重新抽取一次;「复制结果」把号码按顿号分隔的纯文本复制,方便贴到群公告里。
- 「复制对照表」把下方场景对照表按 TSV 复制进电子表格;「导出 CSV」下载带 BOM 的文件,Excel 打开中文不乱码。
随机数字生成器1100能解决什么问题
一是课堂抽号。按 1~100 编号的班级里,点名、抽人回答问题、决定发言顺序,都可以让号码说话:抽 1 个,每个学号单次被抽中的机会恒为 1%;连续抽 10 轮(有放回),某个指定学号至少被抽中一次的概率是 9.56%。允许重复的模式保证了每一轮的公平性互相独立——上一轮被点过的学号,这一轮机会不减少也不增加。
二是抽奖抽签。切到「不重复」,抽 3 个奖号时每位参与者的中签率是 3/100 = 3%;抽 5 个时,所有可能的中奖组合共有 C(100,5) = 75,287,520 种,每一种机会完全均等,不存在「后面的号码更难中」。
三是把「等概率」讲成可核对的数字。100 不能整除 2 的任何整数次幂(2 的 6 次方是 64,2 的 7 次方是 128),是讲解取模偏差与拒绝采样最干净的教学样例——本页把每个中间量都写出来,你可以拿计算器逐项验证。
本页不做这些事:范围永远固定在 1~100,不提供自定义最小值、最大值或步长的能力;不做带权重的抽取(让某个号码更容易被抽中在本页做不到);也不保存任何历史记录。
原理与规则说明
取数入口是 crypto.getRandomValues(new Uint32Array(1)),它输出 0 到 4,294,967,295 之间的均匀整数,来源是操作系统的熵池。要把它变成 1~100 的号码,最省事的写法是直接取模 v % 100,但这有偏差:4,294,967,296 除以 100 余 96,直接取模会让前 96 个下标各多出一次机会,相对偏差约 2.33×10−8。
本页用拒绝采样把偏差降到零。先算接受上限 Math.floor(4,294,967,296 / 100) × 100 = 4,294,967,200,抽取时落在 4,294,967,200 到 4,294,967,295 这最后 96 个值的一律丢弃重抽。接受率是 4,294,967,200 / 4,294,967,296 = 99.99999776%,期望尝试次数 1.0000000224 次——重抽几乎不会真的发生,换来的是每个号码严格 1% 的机会。
为什么不改用 Math.random()。它也能用,但规范只承诺「近似均匀」:Math.random() 的 253 = 9,007,199,254,740,992 个等距值除以 100 余 92,每档基础份额是 90,071,992,547,409 份,数字 1~92 会各多分到 1 份,相对偏差约 1.11×10−14。这个偏差工程上完全无感,但本页的卖点就是严格等概率,所以选了代价几乎为零的 crypto 方案。
不重复模式用的是部分洗牌(Fisher–Yates 截取)。先把 1~100 排进候选池,第 i 轮从剩余部分随机取一个位置与第 i 位交换,取前 n 个即为结果。如果改用「逐个抽取、抽到重复就重来」的笨办法,抽 5 个不重复号码的期望尝试次数是 100/100 + 100/99 + 100/98 + 100/97 + 100/96 ≈ 5.1031 次;洗牌截取一次成型,越抽到后面也不会越卡。
重复是正常现象,有明确的概率。允许重复时,连续两次抽到同一号码的概率是 1%;连抽 12 次「至少出现一个重复号」的概率是 49.68%,13 次时升到 55.72%——抽 12 次就有约一半的机会见到重复,这是生日问题的直接推论,不是工具出了问题。
完整示例(数值仅作演示)
示例条件与页面默认值完全一致:抽 1 个、允许重复——这也是随机数字生成器1100最典型的用法。演示输出为 42。围绕这一条件可以算出的数字:
- 单次抽中指定号码(比如指定 42):1/100 = 1.00%;
- 连续两次抽到同一个号码:1/100 = 1.00%;连续两次恰好抽中指定的两个不同号码(先 7 后 23):1/10,000 = 0.01%;
- 切到不重复、抽 3 个:指定号码被抽中的概率是 3/100 = 3.00%;
- 允许重复、连抽 10 次:指定学号至少出现一次的概率是 1 − 0.9910 = 9.56%;
- 允许重复、连抽 100 次:指定数字出现次数服从 B(100, 0.01),期望 1 次、标准差 0.9950 次;一次都没出现的概率是 0.99100 = 36.60%——超过三分之一的观察者会遇到「白抽一百次」。
把这些数字连起来读:单次看是 1%,十轮看接近一成,百轮看期望一次但波动上下各约一次。演示输出 42 只是为了让页面打开时不是空白,不代表 42 更容易出现。
抽号场景对照表
下表把本页最常用的六种抽法与对应的概率数字汇总。默认 6 行全部展示;「复制对照表」按 TSV 复制,「导出 CSV」下载带 BOM 的文件。所有数值均已独立复算,与正文一致。
| 场景 | 抽法 | 概率口径 | 数值 |
|---|---|---|---|
| 课堂点名抽 1 人 | 抽 1 个,允许重复 | 每个学号单次概率 | 1.00% |
| 连续点名 10 轮 | 抽 10 个,允许重复 | 指定学号至少一次被抽中 | 9.56% |
| 年会抽 3 个奖号 | 抽 3 个,不重复 | 每位参与者中签率 | 3.00% |
| 抽 5 个不重复奖号 | 抽 5 个,不重复 | 组合总数 C(100,5) | 75,287,520 |
| 连抽 12 次出现重复号 | 抽 12 个,允许重复 | 至少两个相同的概率 | 49.68% |
| 抽 100 次的波动 | 抽 100 个,允许重复 | 指定数字出现次数 | 期望 1 次,标准差 0.9950 |
输入边界与取模偏差说明
- 「一次抽几个」限 1~50 的整数。空值、小数、0、负数、超过 50 都会被拒绝并给出具体提示,指出你填了什么、允许什么。上限取 50 是因为不重复模式下一屏读 50 个号码已接近极限,更多号码分批生成即可。
- 不重复模式最多抽 100 个。1~100 每个号码最多出现一次,填 100 会输出这 100 个号码的一个随机排列(每个恰好一次,顺序随机),超过 100 直接报错并建议改回允许重复。
- 为什么 1~100 必须拒绝采样。100 需要 7 个二进制位才能装下(27 = 128 > 100),任何「取高 7 位」或位掩码式的做法都会让前 96 个下标各多 1/42,949,672 份机会(相对偏差 2.33×10−8);只有「算出接受上限、丢弃尾部、重抽」能把偏差真正归零。
- 随机源缺失时明确报错。如果浏览器没有提供
crypto.getRandomValues,本页会提示并停止工作,而不是悄悄回落到质量较差的伪随机数。 - 结果不落盘。号码只存在当前页面的内存里,不写 localStorage 也不写 Cookie,刷新或关闭标签页即清空;需要留档请点「复制结果」或「导出 CSV」。
- 范围固定,不含其他区间。本页的最小值和最大值不可修改,这是它与自定义区间工具的分界线;需要别的区间请看「相关工具」一节。
常见问题
为什么连抽 12 次就出现了重复的号码?
因为重复本来就该出现。允许重复时,12 次抽取里至少两个相同号的概率是 49.68%,13 次时 55.72%——将近一半的观察者会在 12 次内见到重复。想「抽过的不再出现」,应该切到「不重复」模式,那是洗牌截取,物理上保证不重复。
抽了 100 次,指定的数字一次都没出现,正常吗?
正常。有放回抽 100 次时,指定数字出现次数的期望是 1 次、标准差 0.9950 次,而一次都不出现的概率是 0.99 的 100 次方,约 36.60%。「白抽一百次」发生在超过三分之一的观察者身上,与「每个号码 1%」的设定完全一致。
为什么不用 Math.random(),非要用 crypto?
Math.random() 的 2 的 53 次方个等距值除以 100 余 92,数字 1~92 各多一份份额,相对偏差约 1.11×10 的负 14 次方。它很小,但本页承诺严格等概率;crypto.getRandomValues 加拒绝采样用 1.0000000224 次的期望尝试把偏差压到零,代价可以忽略。
不重复模式抽满 100 个会输出什么?
输出 1~100 的一个随机排列:每个号码恰好出现一次,顺序完全随机。等价于把一副 100 张的牌洗匀后依次翻开。这一结果里没有任何号码被抽中两次,也没有任何号码缺席。
能改成抽 50 以内或其他范围吗?
不能。本页(随机数字生成器1100)的范围固定为 1~100,最小值和最大值都不提供输入框,这是刻意设计:固定区间让「1% 每号」的口径简单可靠。需要其他区间或负数时,请使用站内按范围划分的其他随机工具(见「相关工具」)。
抽取结果会自动保存吗?
不会。结果与条件都只存在当前页面内存里,不写任何本地存储,也不发送任何网络请求;刷新页面即清空。开发者工具的 Network 面板里看不到任何与本页相关的请求,可以自行验证。
导出的 CSV 用 Excel 打开是乱码吗?
不是。导出时在文件开头写入了 UTF-8 BOM(字节 EF BB BF),Excel 读到它会按 UTF-8 解析,中文表头和数值都不会乱码。注意这一规则只适用于 CSV:如果导出 JSON 文件,开头反而不能带 BOM,否则解析器会直接报错。
连续点「生成」会不会越点越慢?
不会。允许重复时每次抽取固定调用一次(平均 1.0000000224 次)随机接口,不重复模式的洗牌也只交换前 n 个位置,单次成本都是常数。本页没有任何随使用次数增长的状态。