使用方法
- 在「最小值」里填 -30(示例值,也是页面默认值)。负数直接输入,减号用英文半角;这一栏决定区间的下沿。
- 在「最大值」里填 30。它必须大于最小值——两者相等时区间里只剩一个固定的数,随机会退化成每次输出同一个值,本页会直接报错。
- 在「步长」里填 1。想只出 5 的倍数就填 5,想留一位小数就填 0.1;步长决定区间里有哪些「合法取值」。
- 在「一次抽几个」里填 5,允许 1~50 的整数。打开页面时结果区已有一组演示输出(-17、-3、8、14、26,数值仅作演示)。
- 点「生成」,或在任一输入框里按 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。围绕这一条件可以核对的数字:
- 区间大小 (30 − (−30)) / 1 + 1 = 61 个取值,从 -30 到 30 一个不缺;
- 指定值(比如 -17)单次被抽中的概率 1/61 ≈ 1.6393%;
- 把步长改成 5:取值个数变成 Math.floor(60/5) + 1 = 13 个(-30、-25、-20 直到 30);
- 把区间缩成 -5~5:取值个数 11 个;
- 有放回抽 5 次,至少两个相同的概率 15.47%——五个数里出现重复并不罕见。
如果这次抽到的是 -17,下一次 -17 依然有 1.6393% 的机会再次出现;它不会因为「刚被抽过」而退场。需要不重复的抽法时,本页不提供,请看「相关工具」里的洗牌类工具。
区间与步长对照表
下表列出七组典型设置的取值个数与备注,数值均已独立复算。「复制对照表」按 TSV 复制,「导出 CSV」下载带 BOM 的文件,Excel 打开中文不乱码。
| 最小值 | 最大值 | 步长 | 取值个数 | 备注 |
|---|---|---|---|---|
| -30 | 30 | 1 | 61 | 页面默认示例,跨零区间 |
| -5 | 5 | 1 | 11 | 最小的小型跨零区间 |
| 0 | 100 | 5 | 21 | 只出 5 的倍数:0、5、10 直到 100 |
| 1 | 99 | 7 | 15 | 末值 99,最后半格被砍掉 |
| -30 | 30 | 5 | 13 | 负数区间配步长:-30、-25 直到 30 |
| 1000 | 9999 | 1 | 9000 | 大区间,拒绝采样接受率 99.99987669% |
| 0 | 1 | 0.01 | 101 | 整数化算法:放大 100 倍后在整数域抽 |
输入边界与精度说明
- 最小值与最大值:|数值| ≤ 9,007,199,254,740,991(2 的 53 次方减 1)。这是 JS 安全整数上限,超出后区间加减运算会丢精度,本页对超限输入直接报错。最大值必须严格大于最小值,相等和小于是两条独立的报错路径,各有具体文案。
- 步长必须大于 0,且精度到 0.000001。填 0、负数、纯小数点都会被拒绝;小数位超过 6 位的步长同样报错——放大倍数封顶后更细的步长会算出不足一格的间隔,本页宁可拒绝也不悄悄降精度。
- 取值个数上限 10,000,000。区间太大时(比如步长 0.001 配上极宽的范围),本页会拒绝并提示拉大步长或缩小范围,避免一次性生成天文数字般的下标空间。
- 数量限 1~50 的整数。空值、小数、越界各有独立文案。抽取是有放回的独立事件,抽 5 次出现重复值的概率见上文,不做去重。
- 随机源缺失时明确报错。浏览器没有
crypto.getRandomValues时本页停止工作并说明原因,不会回落到 Math.random() 之类质量较低的伪随机数。 - 结果不落盘。所有输入与输出只存在于当前页面内存,不写 localStorage、不写 Cookie、不发任何网络请求,刷新即清空。
常见问题
为什么步长填 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 本身,不是脏数据。
相关工具
- 骰子模拟器:X d Y 记法与多骰求和,骰面点数本质上就是一个等概率的整数区间。
- 是非选择器:区间只有两个值时的特例,输出「是」或「否」。
- 随机真假生成器:生成 true / false 布尔值,等价于二值区间抽取,适合程序测试。
- 决策生成:从你给出的候选项里挑一个,处理「选哪个」而不是「数值是多少」。
- 随机密码生成器:同样是池中随机,但对象是字符而不是数值区间。
- 随机数字1转10生成器:常用小范围的固定预设,免填上下限。
- 随机数字1转1000生成器:大范围的固定预设,与预设页互补。
- 生成器:查看全部分类下的生成器工具。