如何用Python做抽獎程式

更新於 發佈於 閱讀時間約 11 分鐘

首先這是我們的抽獎名單(欄位名稱、欄位數量與內容不限,可自由調整增加)

raw-image


這是我們的獎品清單(欄位名稱需固定,內容可自由調整)

raw-image

抽獎程式如下

import pandas as pd

import random

#匯入抽獎名單

name_list = pd.read_excel("抽獎名單.xlsx")

#匯入獎品清單

prize_list = pd.read_excel("獎品清單.xlsx")

#------------------------------------------------------------

#是否可在【整場抽獎】中重複中獎(若為False則為不可重複中獎,True為可以重複中獎)

reap_winning_in_game = False

#是否可在同一【獎項類別】內重複中獎(若為False則為不可重複中獎,True為可以重複中獎)

reap_winning_in_prize_class = False

#是否可在同一【獎項名稱】內重複中獎(若為False則為不可重複中獎,True為可以重複中獎)

reap_winning_in_prize_name = False

#------------------------------------------------------------

#【整場抽獎】中獎人_list

winner_sheet_all_list = []

#【整場抽獎】中獎序號_list

winner_list_in_game = []

#【整場抽獎】中獎人_list

winner_sheet_all_list = []

#計算抽獎名單之人數

name_list_count = len(name_list)

#在每個【獎項類別】內:

for prize_class in prize_list["獎項類別"].unique():

#在該【獎項類別】中:

prize_list_ing = prize_list[prize_list["獎項類別"] == prize_class]

#在該【獎項類別】中之中獎序號_list

winner_list_in_prize_class = []

#在該【獎項類別】中,的每個獎品名稱內:

for prize_name,num_of_prizes in zip(prize_list_ing["獎項名稱"],prize_list_ing["獎項數量"]):

#在該【獎項名稱】中之中獎序號_list

winner_list_in_prize_name = []

#如果不可在【整場抽獎】內重複中獎:

if reap_winning_in_game == False:

#持續做抽獎迴圈,直到該【獎項名稱】中獎序號_list內數量=該獎品數量:

while len(winner_list_in_prize_name) < num_of_prizes:

#隨機抽出中獎序號

num = random.randint(0,name_list_count-1)

#如果抽出的序號不在【整場抽獎】中獎序號_list中,才將該序號放入該【獎項名稱】中獎序號_list

if (num not in winner_list_in_game):

winner_list_in_prize_name.append(num)

winner_list_in_prize_class.append(num)

winner_list_in_game.append(num)

#如果可以在【整場抽獎】內重複:

elif reap_winning_in_game == True:

#如果不可在同一【獎項名稱】內重複 且 不可在同一【獎項類別】內重複:

if (reap_winning_in_prize_name == False and reap_winning_in_prize_class == False):

while len(winner_list_in_prize_name) < num_of_prizes:

num = random.randint(0,name_list_count-1)

if (num not in winner_list_in_prize_name and num not in winner_list_in_prize_class):

winner_list_in_prize_name.append(num)

winner_list_in_prize_class.append(num)

winner_list_in_game.append(num)

#如果不可在同一【獎項名稱】內重複 但 可以在同一【獎項類別】內重複:

elif (reap_winning_in_prize_name == False and reap_winning_in_prize_class == True):

while len(winner_list_in_prize_name) < num_of_prizes:

num = random.randint(0,name_list_count-1)

if num not in winner_list_in_prize_name:

winner_list_in_prize_name.append(num)

winner_list_in_prize_class.append(num)

winner_list_in_game.append(num)

#如果可以在同一【獎項名稱】內重複 但 不可在同一【獎項類別】內重複:

elif (reap_winning_in_prize_name == True and reap_winning_in_prize_class == False):

while len(winner_list_in_prize_name) < num_of_prizes:

num = random.randint(0,name_list_count-1)

#如果抽出的序號不在【獎項名稱】中獎序號_list中,將該序號放入【獎項名稱】中獎序號_list

if num not in winner_list_in_prize_class:

winner_list_in_prize_name.append(num)

winner_list_in_prize_class.append(num)

winner_list_in_game.append(num)

#如果抽出的序號不在【獎項類別】中獎序號_list中,但已經存在在【獎項名稱】中獎序號名單中,將該序號放入【獎項名稱】中獎序號_list

elif (num in winner_list_in_prize_class and num in winner_list_in_prize_name):

winner_list_in_prize_name.append(num)

winner_list_in_prize_class.append(num)

winner_list_in_game.append(num)

#如果可以在同一【獎項名稱】內重複 且 可以在同一獎項類別內重複:

elif (reap_winning_in_prize_name == True and reap_winning_in_prize_class == True):

while len(winner_list_in_prize_name) < num_of_prizes:

num = random.randint(0,name_list_count-1)

winner_list_in_prize_name.append(num)

winner_list_in_prize_class.append(num)

winner_list_in_game.append(num)

#建立一個list,將抽獎名單中,所有在該【獎項名稱】中獎序號_list上的人的明細資料篩選出來,並放入此list

winner_sheet_list = []

for i in winner_list_in_prize_name:

globals()[f"winner_sheet_list_{i}"] = name_list.iloc[i:i+1,:]

winner_sheet_list.append(globals()[f"winner_sheet_list_{i}"])

#將該list上之中獎人明細資料,聚合成一張該【獎項名稱】中獎人清單

globals()[f"winner_sheet_{prize_name}"] = pd.concat(winner_sheet_list,axis=0)

#將該【獎項名稱】中獎人清單加上獎品類別、獎項名稱欄位

globals()[f"winner_sheet_{prize_name}"]["獎項類別"] = prize_class

globals()[f"winner_sheet_{prize_name}"]["獎項名稱"] = prize_name

#將該【獎項名稱】中獎人清單,放入【整場抽獎】中獎人_list

winner_sheet_all_list.append(globals()[f"winner_sheet_{prize_name}"])

#將【整場抽獎】中獎人_list的所有【獎項名稱】中獎人清單,合併為全體中獎人清單

winner_sheet_all = pd.concat(winner_sheet_all_list,axis=0)

#------------------------------------------------------------

#匯出中獎名單

winner_sheet_all.to_excel("中獎名單.xlsx")

中獎名單結果如下:

raw-image


留言
avatar-img
留言分享你的想法!
avatar-img
果農的沙龍
7會員
61內容數
我是果農,這裡有我的人資職涯經驗分享,與我菜鳥般的Python資料分析筆記,還有一些讀書心得,希望對大家有幫助。
果農的沙龍的其他內容
2024/08/23
如何用Python繪製彩色表格
Thumbnail
2024/08/23
如何用Python繪製彩色表格
Thumbnail
2024/08/23
如何調整成Python的日期格式
Thumbnail
2024/08/23
如何調整成Python的日期格式
Thumbnail
2024/08/03
如何用Python繪製百分比直條圖
Thumbnail
2024/08/03
如何用Python繪製百分比直條圖
Thumbnail
看更多
你可能也想看
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
當你邊吃粽子邊看龍舟競賽直播的時候,可能會順道悼念一下2300多年前投江的屈原。但你知道端午節及其活動原先都與屈原毫無關係嗎?這是怎麼回事呢? 本文深入探討端午節設立初衷、粽子、龍舟競渡與屈原自沉四者。看完這篇文章,你就會對端午、粽子、龍舟和屈原的四角關係有新的認識喔。那就讓我們一起解開謎團吧!
Thumbnail
當你邊吃粽子邊看龍舟競賽直播的時候,可能會順道悼念一下2300多年前投江的屈原。但你知道端午節及其活動原先都與屈原毫無關係嗎?這是怎麼回事呢? 本文深入探討端午節設立初衷、粽子、龍舟競渡與屈原自沉四者。看完這篇文章,你就會對端午、粽子、龍舟和屈原的四角關係有新的認識喔。那就讓我們一起解開謎團吧!
Thumbnail
今天要實作和體驗的是拼單字的小遊戲,類似小時候在報紙、英文童書、或著電子辭典的小遊戲,一開始都是空白,隨著使用者拼對而逐漸顯示原本的單字樣貌,直到整個單字拼出來為止。 場景: 電腦隨機從單字庫裡面撈一個單字出來。 讓使用者扮演玩家去玩拼單字的遊戲。
Thumbnail
今天要實作和體驗的是拼單字的小遊戲,類似小時候在報紙、英文童書、或著電子辭典的小遊戲,一開始都是空白,隨著使用者拼對而逐漸顯示原本的單字樣貌,直到整個單字拼出來為止。 場景: 電腦隨機從單字庫裡面撈一個單字出來。 讓使用者扮演玩家去玩拼單字的遊戲。
Thumbnail
相信大家小時候都有和朋友或玩伴玩過一個猜數字的小遊戲,一個人先在1~100裡面設定一個隱藏數字,其他的人去猜,看誰是最後一個猜中的就算輸,或者看誰最快猜中就算贏。 今天要示範如何用Python寫一個猜數字遊戲, 並且會從上層的思考邏輯開始,一步步構建出這個猜數字的小遊戲。
Thumbnail
相信大家小時候都有和朋友或玩伴玩過一個猜數字的小遊戲,一個人先在1~100裡面設定一個隱藏數字,其他的人去猜,看誰是最後一個猜中的就算輸,或者看誰最快猜中就算贏。 今天要示範如何用Python寫一個猜數字遊戲, 並且會從上層的思考邏輯開始,一步步構建出這個猜數字的小遊戲。
Thumbnail
奇怪,名字呢? 在上一章中,我們成功的將"result.txt"檔案讀進來,並且取得了前三名的分數,但是仔細想想,這個程式卻沒有輸出前三名相對應的人名,這樣要怎麼頒獎給獲勝的人呢? 功能需求變更:請將程式修改成可以一同輸出前三名的名字與其分數 分析:按照目前所學,我們可以再多創建一個陣列用來存
Thumbnail
奇怪,名字呢? 在上一章中,我們成功的將"result.txt"檔案讀進來,並且取得了前三名的分數,但是仔細想想,這個程式卻沒有輸出前三名相對應的人名,這樣要怎麼頒獎給獲勝的人呢? 功能需求變更:請將程式修改成可以一同輸出前三名的名字與其分數 分析:按照目前所學,我們可以再多創建一個陣列用來存
Thumbnail
今天想跟大家分享一個用python做的小遊戲,叫做1A2B,這個遊戲的規則很簡單,就是電腦會隨機產生一個四位數的數字,然後玩家要猜這個數字是什麼,每次猜完,電腦會給出幾A幾B的提示,A表示位置和數字都對,B表示數字對但位置不對;例如,如果電腦產生的數字是1234,玩家猜5678,那麼電腦會回
Thumbnail
今天想跟大家分享一個用python做的小遊戲,叫做1A2B,這個遊戲的規則很簡單,就是電腦會隨機產生一個四位數的數字,然後玩家要猜這個數字是什麼,每次猜完,電腦會給出幾A幾B的提示,A表示位置和數字都對,B表示數字對但位置不對;例如,如果電腦產生的數字是1234,玩家猜5678,那麼電腦會回
Thumbnail
Python的random模組是一個非常實用的工具,可以讓我們在程式中生成隨機數或從序列中隨機選擇元素。下面介紹一些常用的random模組函數。 首先,我們需要導入random模組,可以使用以下語句進行導入: 接下來,我們來看看random模組中的一些基本函數: random.random()
Thumbnail
Python的random模組是一個非常實用的工具,可以讓我們在程式中生成隨機數或從序列中隨機選擇元素。下面介紹一些常用的random模組函數。 首先,我們需要導入random模組,可以使用以下語句進行導入: 接下來,我們來看看random模組中的一些基本函數: random.random()
Thumbnail
今天我要跟大家分享的是python寫的猜數字遊戲。遊戲的規則很簡單,就是電腦會隨機產生一個1到100之間的整數,然後讓使用者猜這個數字是多少,每次猜完電腦會提示使用者是猜大了還是猜小了,直到猜中為止,遊戲還會記錄使用者猜了幾次,並根據次數給予不同的評價,下面我們來看看程式碼吧!
Thumbnail
今天我要跟大家分享的是python寫的猜數字遊戲。遊戲的規則很簡單,就是電腦會隨機產生一個1到100之間的整數,然後讓使用者猜這個數字是多少,每次猜完電腦會提示使用者是猜大了還是猜小了,直到猜中為止,遊戲還會記錄使用者猜了幾次,並根據次數給予不同的評價,下面我們來看看程式碼吧!
Thumbnail
亂數是要做什麼用的?生活中其實有很多有關亂數的事,例如說:樂透摸彩、抽籤、驚喜包、中獎者、擲骰子等等都是跟亂數有關哦!它們都是將所有的數都丟進去一個空間裡再隨機抽取,在不重複的狀況下每一個數抽到的機率都是一樣的。 在程式中也有這個玩法哦!但是說是這麼說到底怎麼用,咱們來看看: 語法: 在隨機抽取的時
Thumbnail
亂數是要做什麼用的?生活中其實有很多有關亂數的事,例如說:樂透摸彩、抽籤、驚喜包、中獎者、擲骰子等等都是跟亂數有關哦!它們都是將所有的數都丟進去一個空間裡再隨機抽取,在不重複的狀況下每一個數抽到的機率都是一樣的。 在程式中也有這個玩法哦!但是說是這麼說到底怎麼用,咱們來看看: 語法: 在隨機抽取的時
Thumbnail
本範例為 PHP 載入 CSV檔,進行數據統計,並計算出各號碼開出次數。 資料來源: 政府資料開放平台 公益彩券各年度各期電腦型彩券獎號、銷售金額與獎金總額 載入CSV檔的作法 將資料進行統計整理 將資料放於陣列的方式 自定義函式 完整原碼
Thumbnail
本範例為 PHP 載入 CSV檔,進行數據統計,並計算出各號碼開出次數。 資料來源: 政府資料開放平台 公益彩券各年度各期電腦型彩券獎號、銷售金額與獎金總額 載入CSV檔的作法 將資料進行統計整理 將資料放於陣列的方式 自定義函式 完整原碼
Thumbnail
當我們需要在程式中模擬或實作一些隨機發生的事件,例如模擬猜拳、丟骰子的結果,便需要程式可以根據開發者輸入的數值範圍、型態等,隨機產生一個結果,而Python的random()函數便是用於實現這個功能。
Thumbnail
當我們需要在程式中模擬或實作一些隨機發生的事件,例如模擬猜拳、丟骰子的結果,便需要程式可以根據開發者輸入的數值範圍、型態等,隨機產生一個結果,而Python的random()函數便是用於實現這個功能。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News