將清單隨機排序的意思是,將每一個項目放到一個新的位置,使得清單的每一種可能排列都有相同的機率成為輸出結果。在數學上,這個特性稱為「無偏差排列」(unbiased permutation),而實現它的標準演算法是 Fisher-Yates 洗牌法:從清單的尾端往回走,每一步將目前項目與尚未固定的隨機選取位置進行交換。透過這個方法,起始順序不會影響最終順序,也沒有任何項目比較容易出現在頂部、底部或中間任何位置。在瀏覽器中開啟 List Randomizer,就能把這個特性套用從班級名單到抽獎名單等任何內容,無需安裝任何軟體或建立帳號。

為什麼這很重要:在日常生活中,像是點名學生、抽出抽獎得主、指派家務順序等任務中,有偏差的洗牌會不知不覺地讓某些人占優勢,即使沒有人察覺。Fisher-Yates 洗牌法是無偏差的,所以清單的每一種排列出現的機率都相同。這就是一場你可以捍衛的公平抽籤,與一場別人有理由爭辯的抽籤之間的差別。

速度是需求的另一半。一個公平的洗牌演算法,在真實使用者貼上的清單上也應該要快速——班級名單、自願參加的抽獎報名、衝刺票證、辯論題目等——這些清單常常多達數百或數千個項目。由於重新排序是在瀏覽器中本機進行,只需對陣列走訪一次,即使是非常長的清單,也大概在頁面更新的同一時間內就完成了。

how to randomize a list
如何公平地隨機排序清單

為什麼簡單的洗牌構想往往存在微妙的偏差

人們很容易相信任何有創意的重新排序都夠隨機。乍看之下合理的幾種做法,其實會不知不覺地偏袒某些排列方式,而且清單越長,偏差越大:

  • 依隨機數字排序:為每個項目指派一個隨機鍵值,然後依該鍵值排序。由於排序使用成對比較,後排序的項目比較容易聚集在末端,產生超出機率的明顯偏移,清單越長越明顯。
  • 隨機抽位置 N 次(可重複抽取):這會讓同一個項目在輸出中出現多次,因此有些項目會被略過,有些則會被重複。輸出就不再是輸入的一個排列。
  • 從清單中取一個隨機子集:這會得到一個子集,而不是一個重新排序,而且子集內的順序仍是原本清單的順序,並非洗牌後的順序。

Fisher-Yates 在一個一致的迴圈中避免了上述三個問題:每個項目恰好移動一次,每個輸出位置恰好落入一個項目,而移動位置的選擇與其他所有選擇相互獨立。這種獨立性,正是讓洗牌後的順序在任何具實際後果的抽籤中都站得住腳的原因。

在你的清單上執行洗牌

線上 List Randomizer 將工作流程保持在最精簡,讓焦點留在順序本身,而非設定選項。開啟它、把清單貼進去、按 Shuffle、複製結果。

  1. 把清單貼上或在文字框中輸入,每一行一個項目。
  2. 可以勾選「Remove duplicate lines」(移除重複行),只保留每個唯一項目的第一次出現。
  3. 點擊 Shuffle 按鈕,使用 Fisher-Yates 演算法隨機排序。
  4. 在結果框中讀取洗牌後的清單,隨時可以再按一次 Shuffle 取得新的順序。
  5. 點擊 Copy,將隨機排序後的清單送到剪貼簿,以便在其他地方使用。

整個洗牌過程都在你的瀏覽器中本機執行,因此好幾千行的清單也能瞬間完成重新排序,無需傳送任何資料到網路上。

公平的清單洗牌能省下時間的日常情境

幾乎在任何你需要中立順序——無論稱之為隨機、公平或公正——的時候,清單隨機工具都能默默完成工作。下面的情境展示了人們通常會洗牌什麼內容,以及結果的公平性為何確實重要。

情境被洗牌的內容為什麼公平的洗牌很重要
課堂隨機點名學生姓名避免每次都由同樣幾位學生回答問題,並讓較安靜的學生有真正的機會
抽獎或摸彩活動電子郵件或自願報名資料得主是由可驗證的機率選出,而非由誰先報名決定
站立會議或回顧會議的發言順序團隊成員避免每次會議都是由同一個人先發言
寫作提示與腦力激盪故事素材、配色構想、點子透過強迫你採用原本不會選到的題目,打破創作瓶頸
桌遊或派對遊戲回合順序、選秀順位、挑戰清單在不讓任何人爭論誰先開始的情況下安排該回合
問卷或實驗設計題目或條件順序透過在參與者之間變動題目順序,降低研究中的順序效應

如果你使用提示而非固定清單進行作業,隨機單字清單指南 將逐步說明如何從頭產生全新的提示構想,再餵入洗牌工具。

在洗牌的同時保持清單隱私

隨機排序經常會用在含有敏感資料的清單上:客戶電子郵件、員工姓名、面試候選人、醫療試驗參與者、不應外洩報名名單的抽獎活動,或是單純的個人通訊錄。好消息是,List Randomizer 完全在用戶端執行。你貼上的文字就存在你的瀏覽器分頁中,洗牌在瀏覽器中進行,不會上傳、記錄或傳送至任何伺服器。當你關閉或重新整理分頁時,清單就消失了。

不需要建立帳號、不必安裝擴充功能,也沒有條款聲明的彈出視窗要點選,所以你可以貼上一份員工或抽獎參加者的清單,並以如同在自己電腦上執行腳本的那份信心來進行洗牌。這份隱私保證並非需要你相信的行銷承諾——它單純就是一個用戶端工具的運作方式,因為一開始就沒有伺服器會接收你的文字。

處理空白行、多餘空白與意外重複

真實世界的清單總是雜亂的。複製貼上的名單可能結尾帶著三行空白;試算表匯出常常在儲存格尾端補上多餘空白;而志工值班的報名表上,經常會出現同一個電子郵件被寫了兩次。這個工具會自動處理這些怪僻,讓輸出保持整齊:

  • 在洗牌執行前,空白行會被移除。
  • 每個項目前後的多餘空白會被去除,這樣一個多出來的空格不會變成「不同」的項目。
  • 「Remove duplicate lines」(移除重複行)切換鈕只會保留每個項目的第一次出現,當試算表匯出留下重複時很實用。當重複的項目在抽籤中應保有額外權重時,請將它關閉。

清單大小沒有硬性上限。由於洗牌是在本機進行,而且 Fisher-Yates 只會對清單走訪一次,即使有上千行,重新排序所需的時間也大致等同於頁面更新的時間。

當順序仍然感覺不對:重抽與驗證

如果洗牌結果看起來與預期不同,幾乎一定是因為底下的清單含有重複、隱藏空白,或是你數錯了長度。再按一次 Shuffle 以取得全新的排序——每一次點擊都會執行一次獨立的 Fisher-Yates,所以你可以在結果符合需求前一直重抽。對於像是抽獎或獎學金名單等高風險抽籤,請在公布得主之前,擷取洗牌結果與原始清單長度的螢幕截圖,這樣任何審核抽籤過程的人都能確認名單中有哪些項目,以及有多少項目參與競爭。

相關閱讀:如何在 C# 中隨機排序清單而無需撰寫程式碼