使用Python可設(shè)置抽獎?wù)邫?quán)重的抽獎腳本代碼
功能描述
抽獎系統(tǒng)包含如下特點:
1、可給不同抽獎?wù)咴O(shè)置不同的權(quán)重
2、先從價值高的獎品開始抽
3、已經(jīng)中獎的人,不再參與后續(xù)的抽獎
代碼
第一個數(shù)字表示某一個用戶的中獎編號,第二個數(shù)字表示該用戶的中獎權(quán)重。名單.txt
內(nèi)容為:
1:20
2:10
3:8
4:6
5:6
6:3
7:2
8:1
main.py
內(nèi)容為:
# 抽獎工具 # -*- coding:utf-8 -*- from random import choice def read_name_list(txt_name): with open(txt_name, 'r', encoding='utf-8') as f: txt_list = f.readlines() for i in range(len(txt_list)): txt_list[i] = txt_list[i].rstrip('\n') return txt_list def lottery_draw(name_list, prize_box): full_number = [] for name in name_list: number, weight = name.split(':') full_number += [number] * int(weight) for prize in prize_box: luck_number = choice(full_number) print('【{}】的中獎用戶編號為:{}'.format(prize, luck_number)) full_number = [i for i in full_number if i != luck_number] if __name__ == '__main__': # 導(dǎo)入名單 name_list = read_name_list('名單.txt') # 設(shè)置獎項 prize_box = ['汽車', '電腦', '杯子', '香蕉', '5毛紅包'] # 抽獎 lottery_draw(name_list, prize_box)
運行結(jié)果如下:
【汽車】的中獎用戶編號為:5
【電腦】的中獎用戶編號為:1
【杯子】的中獎用戶編號為:3
【香蕉】的中獎用戶編號為:2
【5毛紅包】的中獎用戶編號為:6
驗證
加一個統(tǒng)計函數(shù)statistics
、修改下lottery_draw
的輸入輸出,然后抽獎1000000次,看看結(jié)果是否和我們設(shè)想的一樣不同用戶中獎權(quán)重不同。main.py
完整代碼如下:
# 抽獎工具 # -*- coding:utf-8 -*- from random import choice from collections import Counter def read_name_list(txt_name): with open(txt_name, 'r', encoding='utf-8') as f: txt_list = f.readlines() for i in range(len(txt_list)): txt_list[i] = txt_list[i].rstrip('\n') return txt_list def lottery_draw(name_list, prize_box, res): full_number = [] for name in name_list: number, weight = name.split(':') full_number += [number] * int(weight) for prize in prize_box: luck_number = choice(full_number) full_number = [i for i in full_number if i != luck_number] res.append(prize+':'+luck_number) return res def statistics(res): prize_cal = {'汽車':[], '電腦':[], '杯子':[], '香蕉':[], '5毛紅包':[]} for i in res: prize, luck_number = i.split(':') prize_cal[prize].append(luck_number) for prize, number in prize_cal.items(): print('【{}】的各用戶中獎次數(shù):{}'.format(prize, Counter(number))) if __name__ == '__main__': # 導(dǎo)入名單 name_list = read_name_list('名單.txt') # 設(shè)置獎項 prize_box = ['汽車', '電腦', '杯子', '香蕉', '5毛紅包'] # 驗證抽獎系統(tǒng) res = [] for i in range(1000000): # 抽獎 res = lottery_draw(name_list, prize_box, res) # 統(tǒng)計數(shù)據(jù) statistics(res)
結(jié)果為:
【汽車】的各用戶中獎次數(shù):Counter({'1': 356978, '2': 178116, '3': 143076, '5': 107189, '4': 107141, '6': 53638, '7': 35943, '8': 17919})
【電腦】的各用戶中獎次數(shù):Counter({'1': 262385, '2': 192168, '3': 160879, '5': 125696, '4': 125308, '6': 65905, '7': 44822, '8': 22837})
【杯子】的各用戶中獎次數(shù):Counter({'2': 189568, '1': 180131, '3': 173171, '4': 144363, '5': 143846, '6': 82818, '7': 56424, '8': 29679})
【香蕉】的各用戶中獎次數(shù):Counter({'3': 173540, '2': 170010, '4': 162484, '5': 162387, '1': 111469, '6': 104839, '7': 75181, '8': 40090})
【5毛紅包】的各用戶中獎次數(shù):Counter({'5': 173954, '4': 173772, '3': 157203, '6': 139308, '2': 136231, '7': 103678, '1': 58633, '8': 57221})
可以看出以下結(jié)論:
- 通過第一行可以發(fā)現(xiàn),數(shù)字之間出現(xiàn)的比例是和我們設(shè)置的權(quán)重是一樣。例如
1
出現(xiàn)次數(shù)約等于2
的兩倍、4
和5
的出現(xiàn)次數(shù)相近且均為6
的兩倍。說明中獎數(shù)字出現(xiàn)的概率和預(yù)設(shè)權(quán)重是一樣的。 - 通過后面的行可以發(fā)現(xiàn),對于權(quán)重大的數(shù)字(例如
1
),即使第一個獎品沒中獎,大概率會在前幾個獎品中獎,所以最后一個獎品里1
出現(xiàn)的次數(shù)很少,因為1
基本都是前面出現(xiàn)了。所以權(quán)重大的數(shù)字優(yōu)先中價值高的獎品,和設(shè)想的一樣。 - 對于權(quán)重小的數(shù)字,例如
7
、8
,不管是哪一個獎品,出現(xiàn)次數(shù)都是最小的,說明這些數(shù)字中獎概率低。原因也很簡單,因為中獎數(shù)字的個數(shù)是小于獎品數(shù)量的,所以權(quán)重小的數(shù)字中獎概率低,很可能5個獎品里都抽不到它們。如果設(shè)置為8個獎品的話,那么末尾的獎品7
、8
出現(xiàn)次數(shù)就會很高,因為此時中獎數(shù)字的個數(shù)等于獎品數(shù)量,所有數(shù)字都100%中獎,那么權(quán)重小的數(shù)字基本上都是中價值低的小獎。例如下面是8個獎品時的實驗結(jié)果:
【汽車】的各用戶中獎次數(shù):Counter({'1': 357293, '2': 178396, '3': 142964, '4': 106969, '5': 106885, '6': 53787, '7': 35860, '8': 17846})
【電腦】的各用戶中獎次數(shù):Counter({'1': 262439, '2': 191894, '3': 160317, '4': 125823, '5': 125372, '6': 66868, '7': 44747, '8': 22540})
【杯子】的各用戶中獎次數(shù):Counter({'2': 189590, '1': 179792, '3': 172228, '4': 144894, '5': 144557, '6': 82114, '7': 57173, '8': 29652})
【香蕉】的各用戶中獎次數(shù):Counter({'3': 173294, '2': 170689, '4': 162112, '5': 162085, '1': 111105, '6': 105137, '7': 75643, '8': 39935})
【5毛紅包】的各用戶中獎次數(shù):Counter({'5': 174098, '4': 173631, '3': 158224, '6': 138613, '2': 135805, '7': 103940, '1': 58826, '8': 56863})
【空氣】的各用戶中獎次數(shù):Counter({'6': 201214, '7': 162491, '4': 156446, '5': 156151, '3': 117426, '8': 95013, '2': 87502, '1': 23757})
【垃圾】的各用戶中獎次數(shù):Counter({'7': 282600, '6': 225701, '8': 187694, '5': 99963, '4': 99165, '3': 60536, '2': 38211, '1': 6130})
【一巴掌】的各用戶中獎次數(shù):Counter({'8': 550457, '7': 237546, '6': 126566, '4': 30960, '5': 30889, '3': 15011, '2': 7913, '1': 658})
到此這篇關(guān)于Python可設(shè)置抽獎?wù)邫?quán)重的抽獎腳本的文章就介紹到這了,更多相關(guān)Python抽獎腳本內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python人工智能tensorflow構(gòu)建循環(huán)神經(jīng)網(wǎng)絡(luò)RNN
這篇文章主要為大家介紹了python人工智能tensorflow構(gòu)建循環(huán)神經(jīng)網(wǎng)絡(luò)RNN,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05apache部署python程序出現(xiàn)503錯誤的解決方法
這篇文章主要給大家介紹了關(guān)于在apahce部署python程序出現(xiàn)503錯誤的解決方法,文中通過示例代碼介紹的非常詳細(xì),對同樣遇到這個問題的朋友們具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-07-07pycharm社區(qū)版安裝node.js插件運行js代碼方法
PyCharm可以說是當(dāng)今最流行的一款Python IDE了,下面這篇文章主要給大家介紹了關(guān)于pycharm社區(qū)版安裝node.js插件運行js代碼的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10