随机数生成器

在任意最小值和最大值之间生成随机数。可一次抽取一个或多个数字,并选择是否允许重复。使用安全的随机算法。

快捷范围:

如何生成随机数

  1. 输入最小值和最大值。两端的数也包含在内,所以设为 1 到 10 时,1 和 10 也可能出现。也可以使用负数,例如 −50 到 50。
  2. 设置生成个数,每次可生成 1 到 10,000 个。
  3. 如果同一个数不能出现两次,勾选不重复;想按从小到大的顺序查看,勾选结果排序。
  4. 点击生成,或在任意输入框中按回车键。点击复制可把结果以逗号分隔的形式复制到剪贴板。

快捷范围按钮会填入常用范围——骰子(1–6)、1–10、1–100 和 1–1000——并立即生成一个数。

关于设置的几点说明

  • 只生成整数。如果输入小数,范围会向内取整:最小值 1.5 变成 2,最大值 9.7 变成 9。
  • 不重复需要足够多的数。无法从 1 到 6 中抽出 10 个不同的数,这时工具会告诉你范围内一共有多少个不同的数。
  • 重复比想象中来得更早。在允许重复的情况下从 1 到 100 中抽 10 个数,至少有两个相同的概率约为 37%。如果重复会影响结果,请勾选不重复。
  • 非常大的范围也没问题。范围最宽可达 9,007,199,254,740,992(2 的 53 次方),这是 JavaScript 能精确表示每一个整数的上限。

示例

  • 250 张抽奖券抽 3 个奖:最小值 1,最大值 250,生成个数 3,勾选不重复。每张抽奖券被抽中的概率是 250 分之 3(1.2%),同一张券不会中两次。
  • 双色球式选号:先从 1 到 33 中不重复地抽 6 个数并排序,作为红球;再从 1 到 16 中抽 1 个数,作为蓝球。总共有 17,721,088 种组合,每一种出现的概率都完全相同,包括 1、2、3、4、5、6 这样的组合。
  • 表格抽样检查:要从 500 行中检查 20 行,就从 1 到 500 中不重复地抽 20 个数并排序,然后从上到下依次查看这些行号。
  • 两个骰子:把范围设为 1–6,生成个数设为 2,允许重复。这和从 2 到 12 中抽一个数并不一样:掷两个真骰子时,点数和为 7 的概率是 36 分之 6,而点数和为 2 的概率只有 36 分之 1。每个骰子分别抽,才能还原这样的概率。

随机性从何而来

很多简单的随机数工具使用 JavaScript 的 Math.random()。它用于游戏和动画没问题,但浏览器并不保证它的结果不可预测。本工具改用浏览器的密码学安全随机数生成器 crypto.getRandomValues(),它以操作系统收集的熵为来源,和生成加密密钥所用的随机数属于同一类。

把随机值换算成指定范围内的数也有讲究。常见的“随机值除以范围大小取余数”的做法会有轻微偏差:比如用 0–255 的随机字节对 100 取余,0–55 每个数有三种出现方式,而 56–99 只有两种。本工具会丢弃落在末尾不完整区间的随机值并重新抽取,因此范围内每个数的概率完全相同。当不重复抽取要占用范围的很大一部分时,它不会一遍遍重抽重复的数,而是用费雪-耶茨(Fisher–Yates)洗牌法把整个范围打乱,再从前面依次取出。

使用创意

  • 课堂:按学号随机点名,或随机决定讲哪道题、读哪一页。
  • 游戏:代替丢失的骰子,决定先后顺序,或随机触发事件。
  • 抽奖活动:给参与者编号——抽奖券号、评论楼层、报名表行号——再抽出中奖者。
  • 工作与学习:挑选质检样本、分配测试用例,或生成测试数据。

如果要从名单而不是数字中抽取,请用随机抽名;想让观众看到抽奖过程,可以用幸运大转盘。生成密码请使用专门的密码生成器。

常见问题

以后还能再得到同样的数吗?

不能。这里没有可设置的种子,每次点击都是一次全新的独立抽取,所以结果无法复现。如果抽取过程需要让别人核实,比如公开抽奖,请录屏,或者截一张同时显示设置和结果的图。

很久没出现的数,是不是快该出了?

不是。每次抽取都与之前的结果无关,所以即使某个数在最近 50 次里一次都没出现,它下一次出现的概率也和其他数完全相同。

能生成小数吗?

不能直接生成,但可以通过放大范围来实现。比如需要 0 到 1 之间、保留两位小数的值,就从 0 到 100 中抽一个数再除以 100。

可以用于正式的抽奖或开奖吗?

它的随机性对一般抽奖来说绰绰有余。但彩票之类受法律监管的开奖以及部分有奖促销活动,对抽取和公证方式可能有专门规定,请先确认适用的规则。