🛝Toolio
关于 联系方式

🪜 鬼脚图(Amidakuji)

点击“绘制梯子”,工具会为每位玩家绘制一条垂直线,然后使用Math.random()在固定的12行中随机散落水平横杆。因为每根横杆只交换两条相邻的线,且同一行的任何两根横杆都不允许接触,所以整个梯子在数学上可以保证每位玩家都匹配到一个唯一的结局——无论横杆落在哪里,都不会有重复的匹配。之后点击一个名字,画布会重新绘制相同的梯子,并点亮该玩家的路线,这样你可以逐步观看决策过程,而不是直接得到结果。

鬼脚图使用JavaScript的Math.random()在您的浏览器中生成一个随机的amidakuji(鬼脚图)抽签梯子,使用HTML Canvas API绘制并动画化每位玩家的路径,直到他们到达一个独特的结果。

点击一个名字来追踪其路径。

隐私优先设计. 此工具完全在您的浏览器中运行 — 您输入的任何内容都不会上传或存储,并且可以离线使用。

关于

这里的公平性声明不是营销手段,而是直接来源于横杆的放置方式。每行12行都是通过遍历每对相邻的线,并通过Math.random() < 0.45来决定是否放置横杆,但代码会明确跳过一个位置,如果它左边的位置刚刚放置了横杆("!(i > 0 && row[i-1])")。这一个保护机制意味着任何一行都不可能包含两个重叠的交换,因此每一行本身都是一个干净的、不重叠的交换集合——即列的排列。将12个这样的排列堆叠在一起,就是连续地组合12个排列,而排列的组合本身也是一个排列。这就是为什么两个玩家得到相同结果在这里不仅是不太可能,而且在结构上是不可能的,无论随机滚动的结果如何。

这个保证并不涵盖结果在所有可能配对中分布的均匀程度。无论你输入多少玩家,梯子始终使用相同的12行——源代码中将这一数值设为固定常量,而不是随着玩家数量变化而变化。对于该工具设计的3到10名玩家范围,12行独立的45%概率滚动提供了足够的交叉,让人感觉像是一次真正的洗牌。但如果输入30或50个名字,12行就不足以达到所有可能配对的均匀分布——人们更可能落在他们起始列附近,而不是像真正的均匀洗牌那样随机分布。如果你需要为一个大群体进行公平的随机匹配,使用一个平坦的随机分配器比一个最多只有12行的梯子更合适。

也值得直接说明Math.random()是什么和不是什么。它是浏览器内置的伪随机数生成器——快速,足够用于决定谁洗碗,通常参与者无法从页面外部影响它。但它不是加密安全的:如果有人能够观察到足够多的输出或知道引擎的算法,其内部状态在理论上是可以预测的,这就是为什么涉及真实金钱抽奖、授权彩票或任何具有法律意义的抽奖活动会使用crypto.getRandomValues()或经过审计和认证的随机数生成器。这个工具不使用这些方法,对于分配家务或决定谁买咖啡来说,它也不需要——只是不要在实际奖品上使用它。

在交互方面:"绘制梯子"会重新运行整个横杆放置程序,因此每次点击都是独立的抽样,不记得上一次的结果。"显示所有"会跳过逐个点击名字的揭示过程,一次性在同一条梯子上打印所有玩家与结果的配对。这个版本中没有内置的保存、导出或分享按钮——梯子只存在于画布元素上的像素中,刷新页面会将其清除,同时重置两个文本框回到示例名称和奖品。如果你想记录结果,唯一的方法是在导航离开之前使用浏览器或设备的原生截图工具。关于工具的其他一切功能都与广告宣传完全一致:它在页面加载后完全在客户端运行,没有任何网络请求,因此你输入的任何内容都不会上传,并且即使在没有网络连接的情况下也能继续工作。

如何使用

  1. 在“玩家”框中输入每个玩家的名字,每个名字一行——示例名称(Amy, Ben, Cara, Dan)仅用于显示格式,可以完全替换。
  2. 在“结果”框中输入对应的结局,每个结局一行——如果两个列表的行数不一致,工具将拒绝绘制并显示错误。
  3. 点击“绘制梯子”以运行新的一轮Math.random()调用,并在画布上揭示一组全新的横杆——每次点击都是独立的抽样。
  4. 点击或点击梯子上方的任何玩家名字芯片,以用强调色从上到下动画化他们的单条路径,并揭示他们匹配的结果。
  5. 如果您更倾向于跳过逐个揭示,点击“显示所有”以一次性在同一条梯子上打印所有玩家与结果的配对。

常见问题

梯子使用真正随机、不可预测的数字生成器吗?
它使用浏览器内置的Math.random(),而不是加密安全的crypto.getRandomValues()。这在分配家务或决定谁买咖啡时完全没问题,但Math.random()的内部状态在理论上不是完全无法预测的,如果有人能够观察到足够多的先前输出。不要使用这个工具——或任何基于Math.random()的梯子——来运行涉及真实金钱、具有法律效力的奖品或任何参与者有动机逆向工程抽签的情况。
结果映射真的是一个对一的映射,还是两个玩家可能得到相同的奖品?
一对一的映射是构建时的保证,而不是运气。每根横杆只连接两条相邻的线,代码明确拒绝在同一行放置两根重叠的横杆。这使得梯子的每一行本身都是一个小的、不重叠的洗牌,将12个这样的洗牌堆叠在一起,永远不可能让两个起始线指向同一个终点线——无论随机滚动的结果如何,分配都是一个数学上的双射。
当我添加很多玩家后,梯子仍然公平吗?
这是诚实的限制:梯子始终使用固定的12行,无论玩家数量如何。对于这个工具设计的3到10名玩家范围,这已经足够多的交叉,让人感觉像是一次公平的洗牌。但如果你输入30或50个名字,12行无法产生足够的交叉,以在如此多的可能配对中均匀分布结果——玩家更可能落在他们起始位置附近,而不是像真正的均匀洗牌那样随机分布。对于一个大群体,一个平坦的随机分配工具比一个最多只有12行的梯子更适合。
我可以保存或分享我完成的梯子吗?
不能通过工具本身——这个版本中没有内置的保存、下载或分享按钮。梯子只存在于页面打开时在画布元素上绘制的像素中。如果你想证明结果(经典的“截图以解决争论”),在刷新页面之前使用浏览器或设备自带的截图功能——刷新页面会重置画布和两个文本框,回到示例数据。
这个工具上传任何内容吗?它可以在没有网络的情况下工作吗?
不上传,且可以离线使用。横杆放置、画布绘制和路径追踪都在浏览器的JavaScript引擎中运行,没有任何网络请求,因此即使在没有连接的情况下,工具在页面加载后仍能继续工作,你输入的名字和结果永远不会离开你的设备。
此工具会上传我的数据吗?
不会。所有操作都在您的浏览器中完成,因此您的数据永远不会离开您的设备 — 甚至在页面加载后也可以离线使用。