关于123DiceRoller

123DiceRoller是一个免费的在线骰子模拟器,可以在浏览器里投掷逼真的3D骰子。它的设计目标是公平、快速和保护隐私:结果来自密码学安全的随机数生成器,骰子按真实的物理效果抛出,任何关于你或你掷骰的信息都不会发送到服务器。

一次掷骰是怎样完成的

  1. 先抽取数字。对于每个骰子,你浏览器的Web Crypto API(crypto.getRandomValues)会提供一个32位随机数,再用“拒绝采样”换算成某一面:凡是会让小点数出现得稍微多一点的抽取结果都会被丢弃,所以N面骰的每一面出现的概率都恰好是1/N。
  2. 模拟抛掷过程。刚体物理引擎(cannon-es)会计算重力、摩擦、弹跳以及骰子之间的碰撞,把骰子抛到桌面上。整个抛掷过程在显示之前只需不到一秒就能算完。
  3. 转动骰子,对上结果。每种骰子的形状都是对称的:一个d20有60种不同的旋转方式,转过之后看起来完全一样。模拟器会从中选出一种旋转,让抽到的数字正好落在物理模拟中朝上那一面的位置,并从第一帧起就应用这一旋转。运动是真实的,而数字早已公平地决定好了。
  4. 斜靠的骰子会重新抛掷。如果有骰子停下时会斜靠在另一个骰子上,就会在你看不到的地方重新抛一次,就像真实桌面上遇到这种情况要重掷一样。
  5. 回放抛掷过程,配上阴影、反射,以及与每次碰撞同步的声音。

为什么不让物理引擎决定点数?

因为模拟并不是公平的随机来源。初始位置、时间步长和舍入误差这些细节,都可能让某些面比其他面更常出现,而且没有人能证明不会这样。密码学随机数生成器则是专门为不可预测和均匀分布而设计,并经过检验的。把两者分开,就能两全其美:既有看起来、听起来都很真实的抛掷,又有值得信赖的结果。

精确的概率

每次掷骰显示的概率都是算出来的,而不是估出来的。点数之和通过卷积逐个骰子计算;优势这类取舍掷骰,则把每种不同的结果都数一遍。具体方法请看骰子概率计算器页面的介绍。

技术基础

  • three.js:负责3D渲染(MIT许可证)
  • cannon-es:负责物理模拟(MIT许可证)
  • 服务器端只用纯PHP,没有数据库、没有账号,也没有跟踪

这两个库都由本站直接提供,而不是来自第三方CDN,所以页面从不从其他地方加载代码。

123系列的一员

123DiceRoller与123Calculator以及我们其他免费、无需注册的工具同属一个系列。有问题、想法,或者要报告bug?请发邮件至hello@123diceroller.com。

最后更新: