HandyTools Hub

🪙 抛硬币

抛一枚虚拟硬币——正面还是反面,一键搞定。

🔒 100% 本地处理——抛掷结果不会上传

👑
⭐

0
正面 · 0%
0
反面 · 0%
0
总计

虚拟硬币适合解决那些让一群人卡住的小决定:谁付钱、谁先上、选哪个选项。这个工具旋转一枚 3D 硬币,揭晓正面或反面,并自动记分,显示正反次数和实时百分比。一次点击可批量抛 10、100 或 1000 次,让你亲眼看到概率趋于平均;统计会保存在浏览器里,跨访问保留。

使用方法

  1. 抛一次: 点击抛掷按钮,等待 900 毫秒的旋转。硬币落地时,正面显示王冠图案,反面显示星星图案。
  2. 查看统计: 每次抛掷后,正面、反面、总数以及各面的百分比都会更新。
  3. 批量连抛: 点击 ×10、×100 或 ×1000,立即加入对应次数。动画被跳过,计数器直接跳到新值。
  4. 重置: 重置按钮把两侧计数清零,并清除已保存的统计。

解读统计

三个计数器分别显示正面、反面和总抛掷次数。每一侧计数下方是它的百分比,保留一位小数,所以 10 次里出现 7 次读作 70%。在总数很小时百分比没有意义——抛一次时某一面永远是 100%——所以下结论前至少积累几十次。由于统计存在 localStorage 里,你可以离开标签页、一小时后再回来继续同一次会话;只有重置会清空它。关闭或刷新标签页不会终止会话:在你重置之前,计数会原样恢复。

分母比屏幕上任何单个数字都更重要。序列早期百分比剧烈摆动——连续两次正面读作 100%,再来一次反面就拉回到约 67%。等到积累了几百次,每多抛一次对显示的推动只有零点几个百分点,单个结果几乎看不出来。想做一次干净的演示,就运行 ×1000 批量并读取比例,然后重置再跑一次:两次大规模试验都会接近 50/50,但不会给出完全相同的结果。屏幕上显示的百分比只为阅读而四舍五入;保存的统计存储的是整数次数,因此跨会话不会累积舍入误差。

这里的「随机」到底意味着什么

纯逻辑模块用 rand() < 0.5 抛币,默认取 Math.random。在实际页面上,组件会换入一个基于 crypto 的函数:从 crypto.getRandomValues 读取一个 32 位无符号整数并除以 2 的 32 次方,得到 [0, 1) 上均匀分布的浮点数。对日常抛硬币来说这是可靠的来源,但「随机」不等于「已认证」。这条流来自一个没有公开审计的浏览器 API,不应被当作密码学熵源。如果你复制了底层函数却没有替换 crypto,那就用的是默认的 Math.random,它明确不适合安全用途。32 位读取提供约 43 亿个可能取值,正反两面的判定大约各落在 21 亿个值上——这个粒度远远细于任何日常决策所需。

实操示例:1000 次抛掷长什么样

对一枚公平硬币,n 次抛掷中正面的次数标准差为 sqrt(n × 0.25)。这给出一把有用的标尺:

抛掷次数期望正面数标准差典型 95% 区间
1051.62–8
100505.040–60
1,00050015.8468–532

所以如果 1000 次批量抛掷返回 507 个正面(50.7%),那并不是偏差——它只偏离均值约半个标准差。只有远远落在 95% 区间之外的结果,或在许多大批量上持续偏向某一面,才可能暗示有别于随机的因素。

常见误解

  • 「反面该来了」。 硬币没有记忆。连续五次正面之后,下一次仍然是 50/50。
  • 20 次里出现 60/40 就证明有偏。 小样本噪声很大,这个比例还落在一个标准差之内。
  • 长连号不可能出现。 100 次里连续五六次正面是家常便饭,不是故障。
  • 百分比应当正好卡在 50.0%。 它只保留一位小数,极少正好落在 50。
  • 重置可以撤销。 不能。清除统计会永久丢弃计数,没有历史可供恢复。
  • 单次结果应当可复现。 因为随机源是实时读取的,再跑同一批量通常会得到不同的比例。

实际用途与何时别用

把一面指派给一个选项、另一面指派给另一个,就能打破僵局、决定游戏先手,或者替代一枚丢失的实体硬币。在课堂上,×1000 按钮让大数定律变得可感:随着分母增大,百分比向 50 漂移。心理学家还指出,硬币一旦抛起,你对结果的第一反应往往已经暴露了你真正偏好的选择。你不该拿这个页面去做真实奖品的抽奖、受监管的抽签,或任何牵涉金钱与机密的事——那种场合请改用专门构建的随机源。这个工具是决策辅助,不是权威:如果一群人事先同意认可这次抛掷,那没问题,但页面不保留审计痕迹或防篡改记录,所以规则要在任何人按下按钮之前谈妥。

相关工具

常见问题

抛硬币用的是 Math.random 还是密码学安全的随机源?

纯逻辑模块默认的随机源是 Math.random,但实际页面上会把它替换成 crypto.getRandomValues:取一个 32 位无符号整数除以 2 的 32 次方,得到 [0, 1) 区间内的值,小于 0.5 记为正面,否则记为反面。两者落到硬币上时都只是普通伪随机流,请把结果当作日常可用的公平结果,而不是经过审计的熵源。

为什么抛 100 次不会正好是 50/50?

每次抛掷都是独立的 50/50 事件,一批结果只在次数增大时才趋近均等。100 次抛掷的标准差约为 5 个正面(sqrt(100 × 0.25)),所以大约从 40/60 到 60/40 都完全正常。1000 次抛掷的标准差约为 15.8,因此大批量会更紧地聚在 50% 附近。

累计统计在刷新页面后还在吗?

在。正面、反面和总数会在每次抛掷后写入 localStorage 的 coin-flip:tally 键,下次访问时恢复。重置按钮把计数清零并覆盖保存的值。数据从不发送到服务器;若浏览器存储不可用,工具只在当前会话里继续计数,不做持久化。

一次最多能抛多少次?

批量按钮提供 10、100 和 1000 次,而底层 flipCoins 函数接受 1 到 10000 之间的任意整数。批量结果一次性计入累计统计,所以计数器会直接跳变,而不是逐次动画。一个会话里可以运行的批次数没有上限。

拿它来赌博、抽奖或生成密码安全吗?

不安全。虚拟抛硬币适合日常决定和概率教学,但并非为赌注、官方抽签或密码学用途设计或认证。不同设备上的浏览器随机 API 可能有差异,页面的 JavaScript 也不是经过审计的熵源。涉及金钱或安全时,请使用专门且经过独立验证的随机数生成器。

为什么点击后大约要等一秒才出结果?

单次抛掷会先播放固定的 900 毫秒 3D 旋转动画,然后才更新结果文字和统计,好让揭晓与落地帧对齐。批量抛掷完全跳过动画,立即更新计数。动画进行中再次点击抛掷按钮会被忽略,直到当前旋转结束。

由 HandyTools Hub 团队审校 · 最后更新