使用方法
- 在「骰子数量」里填想掷几颗,范围 1 到 20,默认 3 颗。这是带上下限和步进的输入框,最小 1、最大 20、每次增减 1。
- 在「骰子面数」里选 d4、d6、d8、d10、d12、d20 或 d100,默认 d20;桌游里最常见的就是二十面骰。
- 点掷骰,或在数量框里按 回车,结果区会列出每一颗的点数和它们的总和,并标注这次组合的期望总和。
- 点复制结果把「d20 ×3:14 + 7 + 19 = 40」这类文字带走,方便贴进聊天或战报。数量或面数填错时,页面会用红字具体说明,不会静默归零。
这个 D20 骰子滚轴能解决什么问题
一是跑团与桌游判定。龙与地下城等规则大量用 d20 做攻击、豁免、技能检定,本工具一键掷出多颗,省去手搓实体骰或心算总和。
二是教学演示概率。讲「均匀分布」「期望值」时,当场掷几十次看分布,比纯讲公式直观;下方对照表把累计概率列清楚。
三是快速随机决策。把面数设成 d100 就能做百分骰,用来抽权重、判定暴击,或临时做个公平随机。
本页不做这些事:它不记忆历史、不累计胜率曲线、不做带权重的「出老千」式偏向,也不替代真实赌博用的真随机源;这些请改用专门的统计或随机工具。
掷骰算法原理与技术内核
D20骰子滚轴里每一颗骰子的点数都用同一句算出:点数 = Math.floor(Math.random() × 面数) + 1。因为 Math.random() 返回 0(含)到 1(不含)的小数,乘面数后取整得到 0 到面数减一,再加 1 就把范围平移到 1 到面数,正好覆盖一颗骰子的所有可能。
技术内核可以拆成六个具体问题:
- 调用了哪个函数:单颗用
Math.floor(Math.random() * sides) + 1,多颗用循环把每颗结果塞进数组,再用reduce求总和;全部是浏览器原生函数,无外部库。 - 关键参数为什么取这个值:必须 +1,否则会出现 0 点(真实骰子没有 0);面数直接取自下拉框,保证结果严格落在 1–sides 闭区间。若漏掉 +1,d20 就会偶尔掷出 0,破坏判定逻辑。
- 遵循哪个标准:每颗骰子服从离散均匀分布,每个面概率相等(d20 为 1/20);随机数来自 W3C 定义的
Math.random(),属于密码学不安全的伪随机,足够桌游与演示,但别用于真实赌注。 - 输入经过怎样的转换得到输出:数量 N 与面数 S 进入循环,逐颗生成 1–S 的整数,拼成列表如 [14,7,19],再求和得到 40;同时给出数学期望值 S 加一除以二(d20 为 10.5)乘以 N 作为参考。
- 边界与阈值:数量限定 1–20、步进 1;面数只接受下拉里的 4/6/8/10/12/20/100;总和最大为 20×100=2000,远小于 JavaScript 安全整数 9007199254740991,不会丢精度;空值或非整数数量会被具体提示而非归零。
- 常见误用的正确解释:第一,每次掷骰彼此独立,上一次出 20 不会让下一次更容易出小,也没有「手气」;第二,
Math.random不可设定种子,刷新后无法复现同一局,需要可复现请改用带种子的随机工具;第三,期望值 10.5 是长期平均,单次结果可能偏离很大,这正是随机性的体现。
完整示例(数值为真实计算结果)
- 示例一(默认):掷 3 颗 d20,假设掷出 14、7、19,总和 40;期望总和 = 10.5 × 3 = 31.5。结果区默认就显示这个演示。
- 示例二(d6):掷 2 颗 d6,假设掷出 3、5,总和 8;d6 期望 = (1+6)/2 = 3.5,两额定期望 7。
- 示例三(d100):掷 1 颗 d100 得到 73,范围 1–100,常用于百分判定或暴击率。
- 示例四(期望对照):d4/d6/d8/d10/d12/d20/d100 的单颗期望分别是 2.5 / 3.5 / 4.5 / 5.5 / 6.5 / 10.5 / 50.5,面数越大期望越高,这是线性的。
输入范围与概率对照表
下表列出单颗 D20 每个点数的概率与累计概率(每面 5%),前 12 行直接显示,点「加载更多」展开剩余 8 行。可导出 CSV(带 BOM)或 JSON(不带 BOM),也可一键复制 TSV。
| 点数 | 单面概率 | 累计概率(≤该点) |
|---|---|---|
| 1 | 5.00% | 5.00% |
| 2 | 5.00% | 10.00% |
| 3 | 5.00% | 15.00% |
| 4 | 5.00% | 20.00% |
| 5 | 5.00% | 25.00% |
| 6 | 5.00% | 30.00% |
| 7 | 5.00% | 35.00% |
| 8 | 5.00% | 40.00% |
| 9 | 5.00% | 45.00% |
| 10 | 5.00% | 50.00% |
| 11 | 5.00% | 55.00% |
| 12 | 5.00% | 60.00% |
| 13 | 5.00% | 65.00% |
| 14 | 5.00% | 70.00% |
| 15 | 5.00% | 75.00% |
| 16 | 5.00% | 80.00% |
| 17 | 5.00% | 85.00% |
| 18 | 5.00% | 90.00% |
| 19 | 5.00% | 95.00% |
| 20 | 5.00% | 100.00% |
边界、精度与常见误用
- 数量范围:输入框限定 1 到 20、步进 1。填 0、负数、小数或空值,都会用红字提示「骰子数量需为 1 到 20 之间的整数」,不会悄悄算成 0 颗。
- 面数限制:面数只能从下拉里选 4/6/8/10/12/20/100,不接受任意值;这是为了避免出现「面数=0」导致除法或取整异常。
- 整数结果:每颗点数都是整数,总和也是整数,不存在浮点误差;只有期望值是小数(如 10.5),它是参考线而非实际可能掷出的值。
- 不可复现:
Math.random没有种子,刷新后同一组参数会得到完全不同的结果;如果需要「存档重掷」请用带种子的随机工具。 - 非赌博级:本工具用的是通用伪随机,不是密码学安全随机源,也不做可审计的公平保证,正式博彩或抽奖请勿依赖。
- 仅本地生成:D20骰子滚轴的所有掷骰都在浏览器本地完成,页面不发起任何网络请求,结果不会上传,断网也能继续掷。
常见问题
为什么有时候连掷好几个 20,是不是有 bug?
不是。每次掷骰彼此独立,连续出 20 属于正常的随机波动;d20 出 20 的概率是 5%,连掷多次遇到几次完全在概率范围内。想验证可多掷几十次看分布是否趋近每面 5%。
结果里的「期望总和≈31.5」是什么意思?
期望值是长期平均:单颗 d20 的均值 (1+20)/2 = 10.5,3 颗就是 31.5。它是统计参考线,单次实际总和可能远高于或低于它,不代表你「应该」掷出 31.5。
我能掷超过 20 颗吗?
本页把数量上限设为 20,足够绝大多数桌游与演示;更大的批量会瞬间刷出大量数字,反而难看清。需要超大批量随机请改用随机数字生成器类工具。
这个随机数和彩票、抽马斯卡是一样随机吗?
数学上都是伪随机,但 D20骰子滚轴用的是浏览器通用 Math.random,并非密码学安全随机源,也没有第三方审计。正式博彩、抽奖或安全用途请勿依赖它。
为什么数量框里按回车就能掷?
因为数量框是单行输入,回车没有别的语义,本工具把回车绑定成「掷骰」;面数用下拉框选择。这样不用每次去点按钮,连续多次掷更顺手。
导出的 CSV 在 Excel 里乱码怎么办?
本页 CSV 已在开头写入 UTF-8 的 BOM,正常用 Excel 打开中文不会乱码;纯文本编辑器开头看到几个乱码字符是 BOM 本身,属正常现象,不影响数据。
我掷出的结果会被保存或上传吗?
不会。所有随机数都在你本地浏览器生成,页面不发起任何网络请求,关闭或刷新后结果即消失,不会留下记录。
能不能让某颗骰子更容易出大数(加权)?
本页不做加权,每面严格等概率,这是公平掷骰的默认;带偏向的「出老千」式随机属于另一类需求,不在本工具范围内。