用python實現的兩種抽獎演算法(概率隨機抽獎、次數隨機演算法)
阿新 • • 發佈:2019-01-11
------------次數隨機演算法----------
#抽獎一次少一個名額 class randomMachine(object): import random as rd def setWeight(self, weight): self.weight = weight self.chanceList=[] for k,v in self.weight.items(): for t in range(v): self.chanceList.append(k) def drawing(self): r = self.rd.randrange(0, len(self.chanceList)) # 隨機數 #print("隨機數 : ", r) print(self.chanceList.pop(r)) def graphicsUI(self): pass def start(self): pass if __name__ == "__main__": test = randomMachine() test.setWeight({"一等獎": 1, "二等獎": 1, "三等獎": 1, "安慰獎": 6}) for i in range(9): test.drawing()
執行結果:
---------概率隨機演算法----------
class randomMachine(object): import random as rd def setWeight(self, weight): self.weight = weight WEIGHT = {} weightLength = len(self.weight) # 權重個數 valueCount = 0 # 權重合計 for v in self.weight.values(): valueCount += v for k, v in self.weight.items(): WEIGHT[k] = 1000000 * v / valueCount # 一百萬乘以權重所佔百分比 # 區間 [1,400000,400000+600000] self.compare = {"FIRST_PART": 0} tmp = 0 for k, v in WEIGHT.items(): tmp += v self.compare[k] = tmp def drawing(self): r = self.rd.randrange(1, 1000001) # 隨機數 #print("隨機數 : ", r) tmp = 0 name = '' for k, v in self.compare.items(): #print('k : ', k, "v :", v) #先判斷隨機數是否小於等於範圍 if r <= v: if tmp==0: #第一次判斷 tmp=v name=k if v<tmp: tmp = v name = k print(name) self.weight[k]-=1 #每次執行少一次獎勵 def graphicsUI(self): pass def start(self): pass if __name__ == "__main__": test = randomMachine() test.setWeight({"一等獎": 1, "二等獎": 1, "三等獎": 1, "安慰獎": 6}) for i in range(9): test.drawing()
執行結果:
又花了點時間寫了一個帶Tkinter GUI的版本
程式碼如下
# 抽獎一次少一個名額 class randomMachine(object): import random as rd import tkinter as tk from tkinter import messagebox def setWeight(self, weight): for k, v in weight.items(): for t in range(v): self.chanceList.append(k) def drawing(self): if (len(self.chanceList) <= 0): self.messagebox.showwarning('ERROR', '獎品數不夠') else: r = self.rd.randrange(0, len(self.chanceList)) # 隨機數 # print("隨機數 : ", r) self.rd.shuffle(self.chanceList) # 打亂列表 res = self.chanceList.pop(r) self.messagebox.showinfo('開獎結果', res) print(res) def addPrize(self): try: if self.inputName.get() != None and self.inputName.get() != '': if self.inputChance.get()!= '' and isinstance(int(self.inputChance.get()), int): self.Chance = int(self.inputChance.get()) self.Name = self.inputName.get() self.weight[self.Name] = self.Chance self.setWeight(self.weight) self.weight = {} self.messagebox.showinfo('SUCCESS', '新增獎品成功!') self.inputName.delete(first=0, last='end') self.inputChance.delete(first=0, last='end') else: self.messagebox.showwarning('ERROR', '請輸入一個整數!') else: self.messagebox.showwarning('ERROR', '請輸入獎品名稱!') except Exception as e: self.messagebox.showwarning(e) def checkPrize(self): if (len(self.chanceList) <= 0): self.messagebox.showinfo('ERROR', '沒有獎品了') else: store = {} for tmp in self.chanceList: if store.get(tmp)!=None: store[tmp] += 1 else : store[tmp] = 1 message = '' for k, v in store.items(): message += k + '剩餘 : ' + str(v)+ '個'+'\n' self.messagebox.showinfo('查詢結果', message) def graphicsUI(self): self.window = self.tk.Tk(className='抽獎') # 視窗 self.nameTitle = self.tk.Label() self.nameTitle["text"] = "在此輸入獎品名稱" self.nameTitle.pack() self.inputName = self.tk.Entry() self.inputName.pack() self.chanceTitle = self.tk.Label() self.chanceTitle["text"] = "在此輸入獎品個數" self.chanceTitle.pack() self.inputChance = self.tk.Entry() self.inputChance.pack() self.addButton = self.tk.Button() self.addButton["text"] = '新增' self.addButton["command"] = self.addPrize self.addButton.pack(side='left', padx=30) self.checkButton = self.tk.Button() self.checkButton["text"] = '查詢剩餘獎品' self.checkButton["command"] = self.checkPrize self.checkButton.pack(side='left') self.drawButton = self.tk.Button() self.drawButton["text"] = '開獎' self.drawButton["command"] = self.drawing self.drawButton.pack(side='right', padx=30) self.window.mainloop() def __init__(self): self.weight = {} self.chanceList = [] if __name__ == "__main__": test = randomMachine() test.graphicsUI()
執行結果