我們為 Toolz 的發布做了一個小贈品,我以懶惰的方式繪製了:我將參賽者名單貼到電子表格中,添加了一列 =RAND(),並按它排序。它有效,但一位以統計為生的朋友回頭看了一眼,說:"你知道這其實並不統一,對吧?引用;他是對的,那天晚上我掉進的兔子洞是 Toolz 現在擁有合適的一個重要原因 列出隨機化器 這樣就以正確的方式洗牌了。這本指南是我學到的,是為任何需要從帽子裡拿出名字並希望帽子誠實的人編寫的。
TL;DR: 列表隨機產生器可以隨機重新排序整個列表(隨機播放),也可以從中抽取隨機樣本(選擇)。好的使用 Fisher-Yates 隨機洗牌和加密隨機來源,因此每次排序的可能性相同。使用隨機播放進行回合順序和座位,並選擇贈品和樣本。該工具運行客戶端,預設情況下無需替換即可抽獎,因此獲勝者是唯一的,並且拒絕抽取比列表中擁有的更多獨特的項目。
我在 Laravel 和 React 上建立 SaaS 產品,所以我關心兩件事:正確計算數學,並使介面足夠明顯,讓您永遠不會懷疑抽籤是否公平。事實證明,兩者都比聽起來更重要。
什麼是列表隨機產生器?
列表隨機產生器取得項目列表,每行一個,然後隨機重新排列或取樣。公平的洗牌是一個已解決的問題,答案看起來是正確的:隨機鍵排序是有偏差的,而 Fisher-Yates 洗牌則沒有,瀏覽器提供無偏差的位 crypto.getRandomValues(). 貼上姓名、獎品、任務、團隊或想法,然後按洗牌順序將整個清單交還,或挑選您要求的獲獎者數量。它是從碗中畫出折疊紙條的軟體版本,其優點是消除了人類在嘗試選擇和引用時引入的安靜偏見;隨機&引用;手工。
實際上只有兩個操作,知道你想要哪一個就是整個技能。 Shuffle 會傳回您給它的每個項目,只是以新的隨機順序,因此不會添加或丟失任何內容。選擇傳回一個子集,從池中抽出一定數量的項目。抽獎是一種選擇。決定誰在單口喜劇中首先出現是一個洗牌。大多數人至少一次去找錯誤的人,通常會嘗試"洗牌並拿前三名"當數到三的皮克一步做同樣的事情。
公平的洗牌實際上如何運作?
這是我的統計學家朋友所接觸到的部分。電子表格技巧,為每行分配一個隨機數並進行排序,感覺是隨機的,但不均勻。排序演算法進行比較,當兩個隨機鍵恰好接近時,聯繫和比較解決問題的微小偏差會洩漏到結果中。在小列表中,偏差很小,但它是真實的,對於任何以公平為重點的內容,"夠接近&引用;不是一個很好的答案。
正確的方法是 Fisher-Yates 洗牌,在 Donald Knuth 普及就地版本後,有時被稱為 Knuth 洗牌。它由 Ronald Fisher 和 Frank Yates 於 1938 年描述,並由 Richard Durstenfeld 在 1964 年給出了現代電腦形式。這個想法很簡單。在每個位置,從清單的開頭到當前位置選擇一個隨機索引,然後交換這兩個項目。因為每次交換都從縮小的、明確定義的範圍內抽取,所以每個可能的順序都以完全相同的機率出現。它在線性時間內運行,接觸每個項目一次,並且不需要列表本身之外的額外內存。
的 列出隨機化器 直接使用這個演算法。當你選擇而不替換時,同樣的洗牌會提前停止:洗牌列表,然後拿走前 N 個項目。這保證了獲勝者是不同的,並且每組可能的獲勝者都是同等的可能性。
隨機性從何而來?
演算法只與為其提供資訊的隨機數一樣公平。如果隨機性來源是可預測的或有偏差的,則完美的洗牌仍然會產生偏差的結果。這就是瀏覽器贏得保留的地方。
現代瀏覽器暴露 crypto.getRandomValues,W3C Web 加密 API 的一部分,它用從作業系統熵池中提取的加密強隨機值填充數組。這是一個比更強大的來源 Math.random,這是一個快速的偽隨機生成器,從未用於任何對可預測性重要的事情。隨機發生器更喜歡 crypto.getRandomValues 並且只會回落到 Math.random 當加密來源確實不可用時,在目前的瀏覽器上幾乎永遠不會可用。
我還必須糾正一個更微妙的問題。要將隨機的 32 位元數字轉換為從 0 到 N 減 1 的無偏索引,您不能在除以 N 後只取餘數,因為除非 N 均勻地除以該範圍,否則低索引出現的頻率會稍微高一些。修復方法是拒絕抽樣:計算適合該範圍的 N 的最大倍數,如果抽獎落在截止值之上,則將其丟棄並再次抽獎。它的額外抽獎數量可以忽略不計,並且完全消除了偏差。該工具對其選擇的每個索引執行此操作,直到它丟失之前沒有人注意到這種細節。
如何使用隨機發生器?
該介面有一個按鈕和幾個選擇。這就是我運行它的方式。
將清單貼到輸入框中,每行一項。如果您從電子表格中複製了一個逗號分隔的儲存格,請將輸入分隔符號切換為逗號,它將在逗號上分割。預設情況下,修剪和空白行為會打開,因此雜散的空行和意外的前導空格不會成為虛線條目。
選擇您的模式。隨機播放重新排序一切。選擇抽獎者。如果您選擇"選擇",會出現一個小面板,您可以在其中設定抽獎數量以及是否允許重複。留出重複即可獲得贈品,因此每個獲勝者都是不同的人。只有當您實際想要進行替換採樣時,例如當您模擬骰子般的抽獎時,並且相同的值可以合法地重複出現,才會開啟。
點擊隨機化。您每次都會得到一個新鮮的、獨立的結果,因此如果您想重新繪製,只需再次點擊即可。一鍵複製輸出,將其貼到公告、門票或結果需要存在的任何地方。如果您要求比清單提供的更獨特的獲獎者,工具會告訴您,而不是悄悄返回簡短或重複的列表,這是我看到其他工具犯的錯誤。
實際上,我貼上的清單遍布整個地圖。有時,它是用於抽獎的客戶電子郵件欄,有時,是我團隊中審查下一個拉取請求的姓名,一旦是步行距離內的每家餐廳,因為沒有人可以決定午餐。該工具不在乎物品是什麼,只關心它們是否乾淨地分開。這就是為什麼輸入選項值得關注:如果您的來源是電子表格單元格,逗號分隔符號可以使您免於手動編輯,如果它是帶有空白行的混亂複製粘貼,則直接空白預設會在抽獎前悄悄地清理它。格式化輸入所花費的一分鐘就是您不花時間爭論雜散的空行是否算作條目的分鐘。
我什麼時候該洗牌,什麼時候該選?
這兩種模式涵蓋了不同的工作,下表是我開始時希望擁有的備忘單。
| 你想... | 使用 | 重複 | 為什麼 |
|---|---|---|---|
| 決定發言或輪流順序 | 隨機播放 | 不適用 | 每個人都留下來,秩序是公平的 |
| 抽出一名贈品獲勝者 | 選擇,數1 | 關閉 | 單一獨特結果 |
| 抽獎幾位得獎者 | 選擇,數N | 關閉 | 獨特的獲勝者,沒有雙浸 |
| 將人員分配到兩個團隊 | 洗牌,然後分裂 | 不適用 | 將洗牌的清單分成兩半 |
| 替換模擬市民的樣品 | 選擇,數N | 打開 | 同一項目可能會因設計而重複出現 |
| 隨機化播放清單或閱讀清單 | 隨機播放 | 不適用 | 重新訂購而不掉落任何東西 |
經驗法則:如果項目數保持不變,則洗牌。如果您想要的項目少於您輸入的項目,請選擇。團隊分配是人們過度思考的。洗牌完整列表,然後前半部分為 A 隊,其餘部分為 B 隊,兩隊都是隨機且規模平衡的。
進行公開贈品是否公平?
是的,原因值得簡單說明,因為 "公平&報價;是工具的全部價值。 Fisher-Yates 洗牌、加密隨機來源和拒絕採樣的組合意味著每個參賽者都有相同的機會,並且每組可能的獲勝者都有相同的可能性。這是比物理抽獎更強有力的保證,在物理抽獎中,滑移大小、折疊以及碗的混合程度都會引入偏差。
因為抽獎完全在您的瀏覽器中運行,所以您可以在直播或會議期間在螢幕上直播,這就是人們希望從公開抽獎中獲得的透明度。沒有任何內容會傳送到伺服器,因此沒有隱藏步驟,在點擊和公告之間可以篡改結果。如果您想要審核跟踪,請螢幕記錄抽獎:參賽者名單可見,點擊可見,獲勝者立即出現。
我的清單是私人的嗎?
這比最初看起來更重要,因為人們隨機化的清單通常不公開。候選入圍名單、內部團隊名稱、客戶條目和電子郵件清單都很敏感。隨機產生器使用普通的 JavaScript 在本地處理所有內容。您的清單永遠不會上傳、記錄或存儲,您可以在瀏覽器網路標籤中確認這一點,點擊隨機化根本不會觸發任何請求。一旦頁面加載,它也會保持離線工作。
這是 Toolz 中經過深思熟慮的立場,我在註釋中寫下了推理 線上工具中的資料隱私. 隨機產生器是說明其重要性的一個很好的例子:輸入通常是真實人員的列表,而真實人員的列表正是您不希望坐在您從未審核過的某些伺服器上的請求日誌中的東西。
一些使繪畫更乾淨的習慣
抽獎前先清理清單。如果一個人可能出現兩次,請開啟刪除重複項,因此複式輸入不會秘密地使它們的賠率加倍。預設情況下,掉落空白行是打開的,但值得一看,以確保未計算尾隨的空行。
將計數與獎品相匹配。在選擇模式下,將計數設定為您需要獲勝者的確切數量,然後重複。如果您有三個獎品,請一次抽出三個獎品,而不是單擊一次抽獎三次,這樣可以避免同名者在不同的點擊中出現兩次的尷尬情況。
公開重畫,而不是秘密重畫。如果獲勝者不符合資格,請將其刪除並在觀看者面前重新繪製。公平性來自於過程的可見性,而不是來自第一次點擊時的結果是最終的。
將其保存在瀏覽器中。與我提供的每個工具一樣,本地處理是預設的,因為它更快且私密。如果您正在組裝小型實用程式的個人套件,則 隨機數產生器 自然地與隨機產生器配對以進行數字抽取,並且範圍更廣 開發人員生產力工具 綜述解釋了為什麼瀏覽器優先的工具箱值得建立。
相關工具值得一看
如果隨機選擇是反覆出現的需求,那麼幾個鄰居就會坐在附近。這 隨機數產生器 在具有相同加密等級隨機性的範圍內繪製數字,當您選擇的是值而不是清單中的項目時,這就是您想要的。這 UUID 產生器 為記錄和測試資料產生唯一識別碼。這 密碼產生器 應用相同的強隨機來源來產生安全密碼。所有三個都在瀏覽器中運行,沒有註冊,與隨機發生器完全相同,並且我在 中覆蓋了該系列的標識符側 密碼產生器指南.
常見問題
清單隨機器如何運作?
該工具每行讀取您的清單一個項目,然後重新排序每個項目或吸引您要求的獲勝者。 Shuffling 使用 Fisher-Yates 演算法,它在列表中行走一次,並用隨機選擇的更早位置交換每個項目,從而產生均勻的隨機順序。 隨機位置來自瀏覽器加密生成器,因此結果確實是公正的。
隨機化真的公平嗎?
是的。它藉鑒了 crypto。getRandomValues(現代瀏覽器中內建的加密隨機來源),並使用拒絕採樣,因此沒有索引的可能性比另一個索引稍大。與 Fisher-Yates 洗牌相結合,清單的每種可能的排序都有相同的機會,這比手動洗牌或帶有隨機密鑰的電子表格排序更公平。
如何從名稱清單中隨機選擇一個贏家?
將您的名字每行貼上一個,切換到選擇模式,將計數設定為 1,然後按一下隨機化。 該工具傳回一個隨機名稱。 要一次吸引多位獲勝者,請將計數設定得更高,並停用重複,以便每個獲勝者都是獨一無二的。
洗牌和挑選有什麼不同?
Shuffle 以新的隨機順序傳回您的整個清單,因此沒有添加或刪除任何內容,只需重新排列。 選擇返回一個子集,從清單中提取您指定的獲勝者數量。 使用 Shuffle 進行輪流訂單或座位,並從更大的群體中挑選贈品、樣品或選擇幾個人。
同一物品可以多次挑選嗎?
僅當您啟用重複時。預設情況下,選擇模式抽獎無需替換,因此每個獲勝者都是不同的項目,這就是抽獎或贈品所需要的。開啟重複項允許透過替換進行採樣,其中可以再次出現相同的項目,這對於模擬很有用。
為什麼它不能選擇比我的清單更多的獨特物品?
沒有重複,每個獲勝者必須是獨特的項目,因此您不能從八個清單中抽出十個獨特的獲勝者。 當這種情況發生時,工具會告訴您而不是傳回錯誤的結果。 要么降低計數以匹配您的列表大小,要么啟用重複,以便可以重複使用項目。
我的清單上傳到伺服器了嗎?
否。所有解析和隨機化都在瀏覽器中使用普通的 JavaScript 本地運行,並且不會傳輸、記錄或儲存任何內容。您可以在瀏覽器網路標籤中確認這一點,點擊「隨機化」時不會提出任何請求。頁面載入後,它也可以離線工作。
我可以用它來抽獎或贈品嗎?
是的。 每行貼上您的參賽者,使用禁用重複的選擇模式,並將計數設定為獎品數量。 每次點擊都會吸引一組新鮮、獨立的獨特獲勝者。 由於抽籤是公正的,並且發生在客戶端,因此您可以在螢幕上即時運行它以進行透明度。



