指定范围随机数生成器

最小值、最大值、步长全部由你定义:支持负数区间、小数步长、一次抽多个。页面把区间大小公式、步长取小数时的浮点陷阱、拒绝采样的接受率都写成可以亲手复算的数字。

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

本次抽到:-17、-3、8、14、26
条件:最小值 -30,最大值 30,步长 1,抽 5 个

提示:在任一输入框里按 Enter 也可以直接生成;最小值和最大值都算在范围内(含两端),改了条件后点「生成」即可生效。

使用方法

  1. 在「最小值」里填 -30(示例值,也是页面默认值)。负数直接输入,减号用英文半角;这一栏决定区间的下沿。
  2. 在「最大值」里填 30。它必须大于最小值——两者相等时区间里只剩一个固定的数,随机会退化成每次输出同一个值,本页会直接报错。
  3. 在「步长」里填 1。想只出 5 的倍数就填 5,想留一位小数就填 0.1;步长决定区间里有哪些「合法取值」。
  4. 在「一次抽几个」里填 5,允许 1~50 的整数。打开页面时结果区已有一组演示输出(-17、-3、8、14、26,数值仅作演示)。
  5. 点「生成」,或在任一输入框里按 Enter。「复制结果」把数值按顿号分隔复制;「复制对照表」「导出 CSV」对应下方区间对照表,CSV 带 BOM。

指定范围随机数生成器能解决什么问题

一是可为负的数据抽样。温度、库存盈亏、坐标偏移这些量的天然区间就是负数到正数,默认的 -30~30 就是一个跨零区间:区间里共有 61 个可能取值,每个值被抽中的机会完全相同,不会偏向正数一侧。

二是只出「格子上的数」。把步长设成 5,0~100 的区间里就只有 21 个合法取值(0、5、10 直到 100);步长设成 7,1~99 里只有 15 个取值(1、8、15 直到 99),最后不满一个步长的半格会被直接砍掉。这比「抽完再四舍五入」可靠得多——四舍五入会破坏等概率,让靠近中间的值更密集。

三是给程序造测试数据。指定上下限和精度后,抽出来的数天然落在合法输入域内,可以直接喂给表单校验、边界条件测试;一位小数、两位小数的场景用小数步长即可,不需要再写转换代码。

本页不做这些事:抽取是有放回的,同一个值可能重复出现(本页没有「抽过的不再抽」的发奖模式);每个可能值的概率恒等,不支持给某些值加权;也不提供任何预设区间按钮——上下限永远由你在输入框里自己定义。

原理与规则说明

指定范围随机数生成器的区间大小有一个固定公式:取值个数 = Math.floor((最大值 − 最小值) / 步长) + 1,含两端。按默认条件(-30~30、步长 1)算:(30 − (−30)) / 1 + 1 = 61 个取值;0~100 步长 5 是 100/5 + 1 = 21 个;1~99 步长 7 是 Math.floor(98/7) + 1 = 15 个,最大取值 1 + 14×7 = 99,而 99 之后的 106 已越界,所以末尾那半格不存在。最小值和最大值本身都是合法取值,这一点与多数编程语言里「含头不含尾」的随机区间函数不同。

取数入口是 crypto.getRandomValues(new Uint32Array(1)),先抽出 0 到 4,294,967,295 的均匀整数,再对取值个数做拒绝采样。以 61 个取值为例:4,294,967,296 除以 61 余 57,直接取模会让前 57 个下标各多一次机会;本页先算接受上限 Math.floor(4,294,967,296 / 61) × 61 = 4,294,967,239,落在最后 57 个值的一律丢弃重抽,接受率 99.99999867%,期望尝试 1.0000000133 次。区间越大丢弃越多:1000~9999 共 9000 个取值时,余数是 5,296,接受率降到 99.99987669%,损失的也只有百万分之一多一点。

小数步长必须先整数化,这是本页最关键的实现细节。步长、最小值、最大值三者先同乘 10 的 d 次方(d 取三者小数位数的最大值)化成整数,在整数域里算下标,最后再除回去。不这样做会踩浮点陷阱:JS 里 0.3 / 0.1 的实际值是 2.9999999999999996,直接 Math.floor 会少算一格,把 0.3 这个值整个漏掉;而 0.1 + 0.2 的实际值是 0.30000000000000004,靠逐步累加步长生成取值,输出上会挂出长尾。整数化之后这两个问题都不存在。

概率口径只有一条:每个可能值等概率。61 个取值时,指定值被抽中的概率是 1/61 ≈ 1.6393%;连续两次抽到同一个值的概率同样是 1/61;有放回抽 5 次「至少出现一次重复」的概率是 15.47%。抽取之间互相独立,前一次的结果不影响后一次。

完整示例(数值仅作演示)

示例条件与指定范围随机数生成器的页面默认值一致:最小值 -30、最大值 30、步长 1、抽 5 个。演示输出 -17、-3、8、14、26。围绕这一条件可以核对的数字:

如果这次抽到的是 -17,下一次 -17 依然有 1.6393% 的机会再次出现;它不会因为「刚被抽过」而退场。需要不重复的抽法时,本页不提供,请看「相关工具」里的洗牌类工具。

区间与步长对照表

下表列出七组典型设置的取值个数与备注,数值均已独立复算。「复制对照表」按 TSV 复制,「导出 CSV」下载带 BOM 的文件,Excel 打开中文不乱码。

最小值最大值步长取值个数备注
-3030161页面默认示例,跨零区间
-55111最小的小型跨零区间
0100521只出 5 的倍数:0、5、10 直到 100
199715末值 99,最后半格被砍掉
-3030513负数区间配步长:-30、-25 直到 30
1000999919000大区间,拒绝采样接受率 99.99987669%
010.01101整数化算法:放大 100 倍后在整数域抽

输入边界与精度说明

常见问题

为什么步长填 0.1 的时候,有的工具会漏掉 0.3 这个值?

因为 0.3 / 0.1 在 JS 里的实际值是 2.9999999999999996 而不是 3,直接对它取整会少算一格。本页的算法是把最小值、最大值、步长同乘 10 的 d 次方化成整数后再算,0~0.3 步长 0.1 稳定给出 4 个取值(0、0.1、0.2、0.3),不会漏值。

最小值和最大值能填一样的数吗?

不能。两者相等时区间里只剩一个固定的数,每次输出都相同,随机就失去了意义,本页会明确报错并提示把范围拉开。想要「固定输出某个数」不需要随机工具,直接写死即可。

步长填 0 或负数会怎样?

都会被拒绝。步长为 0 时取值个数公式出现除零,负步长在数学上表示倒序遍历、与「区间内均匀取值」的定义冲突。报错文案会显示你填的原始值,方便核对是不是把步长和数量填反了。

抽出来的数会重复吗?能做不重复抽取吗?

会重复:本页是有放回抽取,61 个取值时连抽 5 次至少重复一次的概率是 15.47%。本页不提供去重模式;如果你的场景是「抽中的号不再参与」,那属于不放回抽样,请使用站内的列表或抽签类工具。

结果会不会偏向区间中间或两端?

不会。取下标走拒绝采样:61 个取值时接受上限是 4,294,967,239,接受率 99.99999867%,剩余下标严格均匀映射到区间两端和中间的每一个值,不存在「中间密、两头疏」的形状。四舍五入式的实现才会产生那种密度差,本页没有采用。

区间特别大的时候会变慢或出错吗?

速度几乎不变:9000 个取值时接受率仍有 99.99987669%,期望尝试 1.0000012331 次。真正会出错的是超过 10,000,000 个取值的极端设置,本页会拒绝并给出具体的调整建议,而不是硬算。

负数区间怎么填?减号有什么讲究?

直接在最小值里填负数即可,例如默认的 -30。注意减号必须是英文半角「-」,全角减号或中文破折号无法被数字输入框识别;从聊天窗口复制过来的数字经常带着全角符号,报错时先检查这一点。

导出的 CSV 打开是乱码怎么办?

本页导出时已在文件开头写入 UTF-8 BOM(字节 EF BB BF),Excel 会按 UTF-8 解析,中文表头不乱码。如果用旧版文本编辑器看到开头多出的「」三个字符,那是 BOM 本身,不是脏数据。

相关工具