随机数字生成器1100

范围固定为 1~100 的整数抽取器:一次抽 1 到 50 个号码,可选允许重复或不重复。页面把 100 不整除 2 的幂造成的取模偏差、拒绝采样的接受率、抽号与抽奖场景的概率全部列成可复算的数字。

抽取方式
示例输出(演示值,点「生成」抽取新的结果):

本次抽到:42
条件:范围 1~100,允许重复,抽 1 个

提示:在「一次抽几个」输入框里按 Enter 也可以直接生成;范围固定为 1~100,不支持自定义最小值或最大值。

使用方法

  1. 在「一次抽几个」里填 1(示例值,也是页面默认值),允许 1~50 的整数。填 1 就是最常见的用法:抽一个号码出来点名。
  2. 选「抽取方式」。「允许重复」是默认项,每抽一次都在完整的 1~100 里取数;「不重复」适合发奖,抽过的号码自动从候选池里移除。
  3. 点「生成」,或在输入框里按 Enter。结果区立即给出号码,并标注当前的条件(范围、是否重复、个数)。打开页面时结果区已经有一组演示输出(42,数值仅作演示)。
  4. 「载入示例」把条件恢复成默认值并重新抽取一次;「复制结果」把号码按顿号分隔的纯文本复制,方便贴到群公告里。
  5. 「复制对照表」把下方场景对照表按 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。围绕这一条件可以算出的数字:

把这些数字连起来读:单次看是 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

输入边界与取模偏差说明

常见问题

为什么连抽 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 个位置,单次成本都是常数。本页没有任何随使用次数增长的状态。

相关工具