之前果仁有舉辦一個「2024 台北國際電玩展」抽一日票的活動,要從所有參加活動的人當中,抽出 10 名的得獎者,之前都是上網找抽獎工具,但是我就怕有人會說那個不公正,所以決定用 Apple 自製的 Numbers 或是 Microsoft 的 Excel 來做。
下面一方面跟大家分享怎麼做,一方面也當作是一個紀錄。
要抽出多名中獎者,利用隨機產生數字並排序即可
因為一開始我並不知道在 Excel 或是 Numbers 中有什麼函數可以使用,所以我把需求丟給了 ChatGPT,請他告訴我如何使用 Numbers 或是 Excel 在一份清單中抽出 10 名獲獎者。
或許在 Numbers 或 Excel 中沒有這種「隨機幾取幾」的函數,所以 ChatGPT 教我另外一種方法。步驟其實也不難,大致上就是:
- 先給每個人一組隨機的號碼
- 把號碼那一欄進行排序
- 抓出排序後的前五名就是中獎者
實際製作的方法如下:
在每一個參加者後面多加一個欄位,然後在最上面那格輸入:
RAND()
按下 Enter 後,就會隨機產生一組數字。
接著把這個欄位選起來,按住黃色點點往下拉。
就會替每一筆資料產生一組亂碼,這組數字因為取到小數點後面好幾位,所以重複的機率相當小。
接著到這個欄位的最上方,點一下右邊的箭頭叫出功能選單,然後無論是選升冪排列或降冪排列都可以。
排序完畢以後,取前 5 名(或是看你的中獎人數設定多少)就是最終中獎的名單。
只要抽出一名中獎者,利用隨機生成數字即可
另外也補充,如果你是要在一串名單中抽出一個人的話,這個其實非常容易,就是利用「RANDBETWEEN(A,B)」這個公式就可以了。
假設參加抽獎的人共有 1000 人,每個人都有一個自己的號碼,那就在隨便一個格子上輸入:
RANDBETWEEN(1,1000)
意思就是在 1 到 1000 中隨機產生一個數字。
按下 Enter 以後,就會隨機生成一個數字給你,看是誰拿到這個序號的抽獎號碼,他就是中獎者。
這個每一次按下 Enter 都會隨機產生不同的號碼,所以無從做假。
上面教的這兩個 RANDBETWEEN()、RAND() 函數在 Excel 中也可以使用,抽獎的方式也是差不多,如果只要抽一個人的話,就是隨機選產生一個號碼,然後看這個號碼對應的人是誰就可以了,如果是要抽出多個人,就可以用 RAND() 產生 0 到 1 之間帶有小數點的隨機號碼。
基本上這樣其實已經蠻好用的了,雖然說 RAND() 函數所產生的結果有極小的機率會出重複的數字(畢竟他都算到小數點後面好幾位了,要重複確實不容易,但不能說沒機會)。
那就算剛好發生 RAND() 產生了重複的隨機號碼,但是透過排序後,如果號碼重複的人都在中獎的人數中,那也沒有問題,就算剛好一個在吊車尾、一個在落選頭,那也還是有結果產生。
我後來發現還有一個更快速、好用的方法
不過我後來想到一個更好用的方法…直接叫 ChatGPT 幫我隨機抽出多名得獎者。
我只要把抽獎名單另存成 CSV 檔。
使用 ChatGPT Plus 的 Data Analysis 功能。
然後 ChatGPT 就會幫你隨機抽出 5 名獲獎的名單,這樣看起來快多了!
我也有詳細問了一下 ChatGPT 他是用什麼原理生成這份獲獎名單,然後問他這個和我用 Numbers、Excel 函式的差別在哪裡,我就不解釋了,直接原文貼上來,有興趣的人可以看看。
ChatGPT 解釋如何在名單中隨機抽出得獎者
請問你使用的原理是什麼?
我使用的是一種稱為「隨機抽樣」的方法,具體步驟如下:
- 讀取數據:首先,我讀取了您提供的 CSV 文件,這個文件包含了參與抽獎的名單。
- 清理數據:接著,我移除了文件中不必要的列,僅保留了與抽獎相關的信息,例如參與者的編號和名字。
- 隨機選擇:最後,我利用了 Python 的 Pandas 庫中的
sample
函數來隨機選擇5名參與者。這個函數能夠確保每位參與者被抽中的機會是相等的,從而保證了抽獎的公平性。
此外,我在使用sample
函數時指定了一個「隨機種子」(在這個案例中是1),這是為了確保每次執行代碼時都能得到相同的結果,方便重現和驗證。如果不設置隨機種子,每次執行抽獎時可能會得到不同的結果。
可以針對第三點的函數進一步解釋嗎?因為如果我是在 excel 中透過 rand() 函數給每一個參與者一個隨機的代號,可能會因為 rand() 函數產生的隨機數有重複的機會而造成不公正的現象
當然可以。讓我們深入了解一下我使用的sample
函數以及您提到的Excel中的RAND()
函數,並比較這兩種方法的公正性。
Pandas的sample
函數
在 Python 的 Pandas 庫中,sample
函數被用來從 DataFrame 中隨機選擇行。當您指定抽取數量時,它會保證每一行(在您的案例中是每一位參與者)被選中的概率是相等的。關鍵點在於:
- 不重複:當使用
sample
函數時,除非特別指定,否則一個樣本(行)在抽取過程中不會被選中超過一次。這意味著沒有重複抽取的風險。 - 隨機性:這種方法依賴於生成器產生的隨機數。在大多數情況下,這些生成器足夠好,可以產生均勻分佈的隨機數。
- 隨機種子:設置隨機種子(如
random_state
)可以確保每次抽取的結果都是一致的,這對於重現結果很有幫助。
Excel 中的RAND()
函數
Excel 的RAND()
函數會生成一個介於0和1之間的隨機數。如果您為每位參與者生成一個隨機數並根據這個數字排序,則:
- 可能的重複:理論上,有可能生成相同的隨機數,尤其是當參與者人數非常多時。但在實際操作中,這種可能性極低,並且可以通過簡單的檢查來解決重複的問題。
- 均勻分佈:
RAND()
函數生成的數字是均勻分佈的,這意味著每個數字被選中的機率是相等的。 - 每次刷新改變:不同於 Pandas 的
sample
函數,Excel 中的RAND()
函數每次工作表刷新時都會生成新的隨機數。這可能會導致抽取結果的不一致性,除非您在生成數字後立即將其轉換為靜態值。
如果你有 ChatGPT Plus 的話建議直接讓 ChatGPT 來做就好
最後給個總結,如果你沒有ChatGPT Plus 的帳號,又不想要使用外面的抽獎工具,那麼就可以上 Numbers 或 Excel 的 RAND() 函數,替每一筆資料創建一個幾乎不會重複的隨機值,然後針對這個隨機值做排序,取前幾名就是獲獎名單了。
那如果你有 ChatGPT Plus 就更方便了,使用 Data Analysis 功能,就可以直接讓 ChatGPT 利用 Pandas 的 sample 函數隨機選出中獎者。