🪙 抛硬币
抛一枚虚拟硬币——正面还是反面,一键搞定。
🔒 100% 本地处理——抛掷结果不会上传
虚拟硬币适合解决那些让一群人卡住的小决定:谁付钱、谁先上、选哪个选项。这个工具旋转一枚 3D 硬币,揭晓正面或反面,并自动记分,显示正反次数和实时百分比。一次点击可批量抛 10、100 或 1000 次,让你亲眼看到概率趋于平均;统计会保存在浏览器里,跨访问保留。
使用方法
- 抛一次: 点击抛掷按钮,等待 900 毫秒的旋转。硬币落地时,正面显示王冠图案,反面显示星星图案。
- 查看统计: 每次抛掷后,正面、反面、总数以及各面的百分比都会更新。
- 批量连抛: 点击 ×10、×100 或 ×1000,立即加入对应次数。动画被跳过,计数器直接跳到新值。
- 重置: 重置按钮把两侧计数清零,并清除已保存的统计。
解读统计
三个计数器分别显示正面、反面和总抛掷次数。每一侧计数下方是它的百分比,保留一位小数,所以 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% 区间 |
|---|---|---|---|
| 10 | 5 | 1.6 | 2–8 |
| 100 | 50 | 5.0 | 40–60 |
| 1,000 | 500 | 15.8 | 468–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 团队审校 · 最后更新