🛝Toolio
關於 聯絡

🪜 鬼腳圖(Amidakuji)

點選『繪製鬼腳圖』,工具會為每位玩家畫出一條垂直線,然後使用 Math.random() 在固定的 12 行中隨機散佈水平橫桿。因為每一根橫桿只會交換兩條相鄰的線,而且在同一行中,任何兩根橫桿都不會接觸,因此整個鬼腳圖在數學上可以保證每位玩家都只會對應到一個結果——不管橫桿落在哪裡,都不會有重複的結果。點選某位玩家的名字後,畫布會重新繪製相同的鬼腳圖,並標示出該玩家的路徑,因此你可以逐步看到決策過程,而不是直接獲得結果。

鬼腳圖會在瀏覽器中生成一個隨機的 amidakuji(鬼腳圖)抽籤圖,使用 JavaScript 的 Math.random() 來放置橫桿,並使用 HTML Canvas API 來繪製和動畫化每位玩家沿著鬼腳圖到達不同結果的路徑。

點選一個名字來追蹤其路徑。

隱私優先設計. 此工具完全在您的瀏覽器中運行 — 您輸入的內容不會上傳或儲存,而且它可以在離線狀態下使用。

關於

這裡所說的公平性並不是行銷話術,而是直接來自於橫桿的放置方式。每一行的 12 行都是這樣建立的:遍歷每一對相鄰的線,並使用 Math.random() < 0.45 來決定是否放置橫桿,但程式碼會在左邊的橫桿剛被放置時跳過一個位置("!(i > 0 && row[i-1])")。這個單一的保護機制確保了每一行都不會包含重疊的交換,因此每一行都是獨立的一組不重疊的交換——也就是對列的一種排列。將十二個這樣的排列疊加在一起,就是連續組合十二個排列,而排列的組合本身也是一個排列。因此,這裡兩位玩家得到相同結果的情況不僅不常見,從結構上來說是不可能發生的,不管隨機結果如何。

這個保證並未涵蓋結果在所有可能配對中分布的均勻程度。不管輸入多少玩家,鬼腳圖始終使用相同的 12 行——源碼中將其設為固定常數,而不是根據玩家數量進行調整。對於這個工具設計的 3 到 10 位玩家範圍,12 行的獨立 45% 機率滾動足夠產生足夠的交叉,讓人感覺像是一次真正的洗牌。但如果將玩家數量增加到 30 或 50 位,12 行就顯得不夠,無法產生足夠的交叉來均勻地覆蓋所有可能的配對——人們更有可能落在接近自己起始位置的列上,而不是像真正均勻的洗牌那樣均勻分布。如果你需要為一個大群組進行公平的隨機匹配,使用一個平坦的隨機分配工具會比一個最多只有 12 行的鬼腳圖更合適。

也值得直接說明 Math.random() 是什麼和不是什麼。它是瀏覽器內建的偽隨機數生成器——快速、足夠用來決定誰洗碗,而且通常無法從頁面外部影響。但這並不是加密安全的:如果有人能觀察到足夠的輸出或知道引擎的演算法,其內部狀態在理論上是可以預測的,這就是為什麼涉及真實金錢的抽獎、有執照的彩票以及任何具有法律效力的抽獎活動會使用 crypto.getRandomValues() 或經過審計和認證的 RNG(隨機數生成器)。這個工具並沒有使用這兩種方法,而且在分配家務或決定誰買咖啡時也無需這麼做——只是不要在這個工具後面放真正的獎金。

在互動方面:『繪製鬼腳圖』會重新運行整個橫桿放置程序,因此每次點選都是獨立的抽籤,與前一次無關。『顯示全部』會跳過逐一顯示玩家結果的過程,直接在鬼腳圖上一次性顯示所有玩家與結果的配對。這個版本沒有內建的儲存、導出或分享按鈕——鬼腳圖只存在於 Canvas 元素上的像素中,重新載入頁面會清除畫布以及兩個文字框,並重置回示範名稱和獎勵。如果你想保留結果的記錄,唯一的途徑是在離開頁面之前使用瀏覽器或裝置自帶的截圖工具。關於這個工具的其他一切功能都與廣告完全一致:它完全在客戶端運行,載入頁面後不需要任何網路請求,因此你輸入的任何內容都不會上傳,而且即使沒有網路連接,它也能正常運作。

如何使用

  1. 在『玩家』文字框中輸入每位玩家的名字,每行一個名字——示範名字(Amy、Ben、Cara、Dan)僅顯示格式,可以完全替換。
  2. 在『結果』文字框中輸入對應的結果,每行一個結果——如果兩個列表的行數不相同,工具將拒絕繪製並顯示錯誤。
  3. 點選『繪製鬼腳圖』以運行新的一輪 Math.random() 調用,並在畫布上顯示一組全新的橫桿——每次點選都是獨立的抽籤。
  4. 點選或點選鬼腳圖上方任何玩家的名字標籤,以動畫形式用強調顏色從上到下顯示其單獨的路徑,並顯示其對應的結果。
  5. 如果你更想跳過逐一顯示的過程,直接看到所有玩家與結果的配對,請點選『顯示全部』。

常見問題

鬼腳圖使用的是真正隨機且不可預測的數字生成器嗎?
它使用瀏覽器內建的 Math.random(),而不是加密安全的 crypto.getRandomValues()。這對於分配家務或決定誰買咖啡來說完全足夠,但 Math.random() 的內部狀態在理論上並非完全不可預測,如果有人能觀察到足夠的先前輸出。不要使用這個工具——或任何基於 Math.random() 的鬼腳圖——來運行涉及真實金錢、具有法律效力的獎品,或任何參與者有動機逆向工程抽籤的情況。
結果對應真的是一對一的,還是有可能兩位玩家得到相同的獎品?
一對一的對應是由設計保證的,而不是靠運氣。每一根橫桿只連接兩條相鄰的線,而且程式碼明確拒絕在同一行中放置兩根重疊的橫桿。這使得每一行鬼腳圖本身都是一個小的、不重疊的洗牌,將十二個這樣的洗牌疊加在一起,永遠不可能讓兩條起始線指向相同的終點線——不論隨機結果如何,這都是數學上的雙射。
當我添加很多玩家後,鬼腳圖仍然公平嗎?
這是誠實的限制:鬼腳圖始終使用固定的 12 行,與玩家數量無關。對於這個工具設計的 3 到 10 位玩家範圍,這已經足夠產生足夠的交換,讓人感覺像是一次公平的洗牌。但如果輸入 30 或 50 個名字,12 行無法產生足夠的交換來均勻地覆蓋這麼多可能的配對——玩家往往會落在接近自己起始位置的列上,而不是像真正均勻的洗牌那樣均勻分布。對於大群組,一個平坦的隨機分配工具會比一個最多只有 12 行的鬼腳圖更合適。
我可以儲存或分享我完成的鬼腳圖嗎?
不能通過工具本身——這個版本中沒有內建的儲存、下載或分享按鈕。鬼腳圖只存在於頁面打開時 Canvas 元素上的像素中。如果你想保留結果的證明(經典的『截圖來解決爭議』),請在刷新頁面之前使用瀏覽器或裝置自帶的截圖功能——重新載入會清除畫布以及兩個文字框,並重置回示範數據。
這個工具會上傳任何東西嗎?它可以在沒有網路的情況下運行嗎?
不會上傳,而且可以在離線環境下運行。橫桿放置、畫布繪製和路徑追蹤都在瀏覽器的 JavaScript 引擎中運行,不需要任何網路請求,因此即使在沒有連接的情況下,工具在頁面載入後仍然可以運行,而且你輸入的名字和結果永遠不會離開你的裝置。
此工具會上傳我的資料嗎?
不會。所有運作都在您的瀏覽器中進行,因此您的資料永遠不會離開您的設備 — 頁面載入後,它甚至可以在離線狀態下使用。