使用Python可设置抽奖者权重的抽奖脚本代码

目录
  • 功能描述
  • 代码
  • 验证

功能描述

抽奖系统包含如下特点:
1、可给不同抽奖者设置不同的权重
2、先从价值高的奖品开始抽
3、已经中奖的人,不再参与后续的抽奖

代码

第一个数字表示某一个用户的中奖编号,第二个数字表示该用户的中奖权重。
名单.txt内容为:

1:20
2:10
3:8
4:6
5:6
6:3
7:2
8:1

main.py内容为:

# 抽奖工具
# -*- 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__':
    # 导入名单
    name_list = read_name_list('名单.txt')
    # 设置奖项
    prize_box = ['汽车', '电脑', '杯子', '香蕉', '5毛红包']
    # 抽奖
    lottery_draw(name_list, prize_box)

运行结果如下:

【汽车】的中奖用户编号为:5
【电脑】的中奖用户编号为:1
【杯子】的中奖用户编号为:3
【香蕉】的中奖用户编号为:2
【5毛红包】的中奖用户编号为:6

验证

加一个统计函数statistics、修改下lottery_draw的输入输出,然后抽奖1000000次,看看结果是否和我们设想的一样不同用户中奖权重不同。
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('【{}】的各用户中奖次数:{}'.format(prize, Counter(number)))

if __name__ == '__main__':
    # 导入名单
    name_list = read_name_list('名单.txt')
    # 设置奖项
    prize_box = ['汽车', '电脑', '杯子', '香蕉', '5毛红包']
    # 验证抽奖系统
    res = []
    for i in range(1000000):
        # 抽奖
        res = lottery_draw(name_list, prize_box, res)
    # 统计数据
    statistics(res)

结果为:

【汽车】的各用户中奖次数:Counter({'1': 356978, '2': 178116, '3': 143076, '5': 107189, '4': 107141, '6': 53638, '7': 35943, '8': 17919})
【电脑】的各用户中奖次数:Counter({'1': 262385, '2': 192168, '3': 160879, '5': 125696, '4': 125308, '6': 65905, '7': 44822, '8': 22837})
【杯子】的各用户中奖次数:Counter({'2': 189568, '1': 180131, '3': 173171, '4': 144363, '5': 143846, '6': 82818, '7': 56424, '8': 29679})
【香蕉】的各用户中奖次数:Counter({'3': 173540, '2': 170010, '4': 162484, '5': 162387, '1': 111469, '6': 104839, '7': 75181, '8': 40090})
【5毛红包】的各用户中奖次数:Counter({'5': 173954, '4': 173772, '3': 157203, '6': 139308, '2': 136231, '7': 103678, '1': 58633, '8': 57221})

可以看出以下结论:

  • 通过第一行可以发现,数字之间出现的比例是和我们设置的权重是一样。例如1出现次数约等于2的两倍、45的出现次数相近且均为6的两倍。说明中奖数字出现的概率和预设权重是一样的。
  • 通过后面的行可以发现,对于权重大的数字(例如1),即使第一个奖品没中奖,大概率会在前几个奖品中奖,所以最后一个奖品里1出现的次数很少,因为1基本都是前面出现了。所以权重大的数字优先中价值高的奖品,和设想的一样。
  • 对于权重小的数字,例如78,不管是哪一个奖品,出现次数都是最小的,说明这些数字中奖概率低。原因也很简单,因为中奖数字的个数是小于奖品数量的,所以权重小的数字中奖概率低,很可能5个奖品里都抽不到它们。如果设置为8个奖品的话,那么末尾的奖品78出现次数就会很高,因为此时中奖数字的个数等于奖品数量,所有数字都100%中奖,那么权重小的数字基本上都是中价值低的小奖。例如下面是8个奖品时的实验结果:

【汽车】的各用户中奖次数:Counter({'1': 357293, '2': 178396, '3': 142964, '4': 106969, '5': 106885, '6': 53787, '7': 35860, '8': 17846})
【电脑】的各用户中奖次数:Counter({'1': 262439, '2': 191894, '3': 160317, '4': 125823, '5': 125372, '6': 66868, '7': 44747, '8': 22540})
【杯子】的各用户中奖次数:Counter({'2': 189590, '1': 179792, '3': 172228, '4': 144894, '5': 144557, '6': 82114, '7': 57173, '8': 29652})
【香蕉】的各用户中奖次数:Counter({'3': 173294, '2': 170689, '4': 162112, '5': 162085, '1': 111105, '6': 105137, '7': 75643, '8': 39935})
【5毛红包】的各用户中奖次数:Counter({'5': 174098, '4': 173631, '3': 158224, '6': 138613, '2': 135805, '7': 103940, '1': 58826, '8': 56863})
【空气】的各用户中奖次数:Counter({'6': 201214, '7': 162491, '4': 156446, '5': 156151, '3': 117426, '8': 95013, '2': 87502, '1': 23757})
【垃圾】的各用户中奖次数:Counter({'7': 282600, '6': 225701, '8': 187694, '5': 99963, '4': 99165, '3': 60536, '2': 38211, '1': 6130})
【一巴掌】的各用户中奖次数:Counter({'8': 550457, '7': 237546, '6': 126566, '4': 30960, '5': 30889, '3': 15011, '2': 7913, '1': 658})

到此这篇关于Python可设置抽奖者权重的抽奖脚本的文章就介绍到这了,更多相关Python抽奖脚本内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python趣味实例,实现一个简单的抽奖刮刮卡

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:黑白之道 刮刮卡通常指卡上的一种覆盖数字和字母密码等的涂层,通常包括纸质和电子两种类型,刮刮卡在市场上有着比较广泛的应用,我们见到最多的应该是各类抽奖活动了,本文我们使用 Python 来做一个简单的抽奖刮刮卡. 实现 首先,我们弄几张图片做底板,如下所示: 从图中我们可以看到底图包括:一等奖.二等奖.谢谢惠顾三种,如果我们参与过刮刮卡抽奖的话,会发现几乎刮开都是谢

  • 详解python--模拟轮盘抽奖游戏

    题目: 轮盘分为三部分: 一等奖, 二等奖和三等奖; 轮盘转的时候是随机的, 如果范围在[0,0.08)之间,代表一等奖, 如果范围在[0.08,0.3)之间,代表2等奖, 如果范围在[0.3, 1.0)之间,代表3等奖, 模拟本次活动1000人参加, 模拟游戏时需要准备各等级奖品的个数. import random RewardCount = { '一等奖':(0,0.08), '二等奖':(0.08,0.3), '三等奖':(0.3,1.0) } def RewardGet(): num =

  • 使用 Python 写一个简易的抽奖程序

    不知道有多少人是被这个头图骗进来的:) 事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下手. 其实这个很正常,刚开始学习写代码,都是跟着别人的套路往下写,看的套路少,很难形成自己的套路,这就和做数学题是一样的,做一道题就想会所有的题目,这个可能性微乎其微,都是通过大量的练习来摸索到自己的套路. 正好快过年了,各个公司都会搞一些抽奖活动,小编今天就来聊一下,如果要写一个简单的抽奖程序,小

  • python实现抽奖小程序

    本文实例为大家分享了python实现抽奖小程序的具体代码,供大家参考,具体内容如下 设计一个抽奖服务  背景:有x个奖品,要求在y天内发完:每天至少发放z个奖品:每天抽奖人数不定,事先会假设一个范围是m-n 举例:有100个奖品,要求5天内发完,每天至少发15个奖品:每天来抽奖的人估计是 2000-3000 人,希望奖品能够比较均匀,但随机的抽取出来. 接口要求:服务监听一个端口,测试程序不断连接,发送一个数字代表是第几天,比如第1-2000个请求发送1(模拟第一天来了2000人),第2001到

  • 详解用python写一个抽奖程序

    第一次使用python写程序,确实比C/C++之类方便许多.既然这个抽奖的数据不大,对效率要求并不高,所以采用python写,更加简洁.清晰.方便. 1.用到的模块 生成随机数的模块random 用来读取excel表格的模块xlrd 2.思路:首先打开excel表格,然后读取其中某个单元格或者某行或某列的元素,进行输出或存储. 3.如何保证随机:随机的关键在于取随机数.每抽一个人之前,我们随机生成一个随机数i,i代表了读取第i个人的数据,由于i的生成是完全随机的,所以也就保证了选取的人员是完全随

  • python实现转盘效果 python实现轮盘抽奖游戏

    本文实例为大家分享了python实现转盘效果的具体代码,供大家参考,具体内容如下 #抽奖 面向对象版本 import tkinter import time import threading class choujiang: #初始化魔术方法 def __init__(self): #准备好界面 self.root = tkinter.Tk() self.root.title('lowB版转盘') self.root.minsize(300, 300) # 声明一个是否按下开始的变量 self.

  • Python使用Tkinter实现滚动抽奖器效果

    年底,抽奖这个话题很多人都会讨论,都希望可以中奖. 接下来我就使用 Python 中的 Tkinter 模块来实现一个简单的滚动抽奖器. 一.Tkinter简介 Tkinter 是 Python 的标准 GUI(Graphical User Interface,图形用户接口)库,Python 使用 Tkinter 可以快速地创建 GUI 应用程序. 在 Python2 和 Python3 中,Tkinter 都在标准库中,无需安装即可使用.在 Python2 中,这个库叫 Tkinter ,在

  • python制作抽奖程序代码详解

    实现制作抽奖程序,需要认知到我们可以看到一般抽奖程序界面上是有很多按钮的,比如中奖区域,按键开始区域等等,所以我们先要设置界面,然后把这些按钮添加到界面中去,想必这对于学过tkinter的同学应该不难.下面结合实现步骤:设计界面.利用循环.多线程来完成抽奖程序设置吧. 实现代码: import random #导入内置的random模块 list1=list(range(0,15)) #将range元素进行列表转换并赋值给列表list1 print("抽奖号码是:",list1) #打

  • python实现年会抽奖程序

    用python来实现一个抽奖程序,供大家参考,具体内容如下 主要功能有 1.从一个csv文件中读入所有员工工号 2.将这些工号初始到一个列表中 3.用random模块下的choice函数来随机选择列表中的一个工号 4.抽到的奖项的工号要从列表中进行删除,以免再次抽到 初级版 这个比较简单,缺少定制性,如没法设置一等奖有几名,二等奖有几名 import csv #创建一个员工列表 emplist = [] #用with自动关闭文件 with open('c://emps.csv') as f: e

  • 使用Python可设置抽奖者权重的抽奖脚本代码

    目录 功能描述 代码 验证 功能描述 抽奖系统包含如下特点:1.可给不同抽奖者设置不同的权重2.先从价值高的奖品开始抽3.已经中奖的人,不再参与后续的抽奖 代码 第一个数字表示某一个用户的中奖编号,第二个数字表示该用户的中奖权重.名单.txt内容为: 1:202:103:84:65:66:37:28:1 main.py内容为: # 抽奖工具 # -*- coding:utf-8 -*- from random import choice def read_name_list(txt_name):

  • Python request设置HTTPS代理代码解析

    之前版本的代理中,可以使用fiddler进行HTTP包的代理,但是代理HTTPS包时,执行错误 self._sslobj.do_handshake() ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749) urllib或requests在打开https站点是会验证证书,简单的处理方式就是把发送https请求时把验证ssl证书关掉,即设置verify为False 具体代码设置如:

  • Python爬虫设置代理IP的方法(爬虫技巧)

    在学习Python爬虫的时候,经常会遇见所要爬取的网站采取了反爬取技术,高强度.高效率地爬取网页信息常常会给网站服务器带来巨大压力,所以同一个IP反复爬取同一个网页,就很可能被封,这里讲述一个爬虫技巧,设置代理IP. (一)配置环境 安装requests库 安装bs4库 安装lxml库 (二)代码展示 # IP地址取自国内髙匿代理IP网站:http://www.xicidaili.com/nn/ # 仅仅爬取首页IP地址就足够一般使用 from bs4 import BeautifulSoup

  • python批量设置多个Excel文件页眉页脚的脚本

    本文实例为大家分享了python批量设置多个Excel文件页眉页脚的具体代码,供大家参考,具体内容如下 import os import openpyxl from openpyxl.worksheet.header_footer import _HeaderFooterPart xlsxFiles = (fn for fn in os.listdir('.') if fn.endswith('.xlsx')) for xlsxFile in xlsxFiles: wb = openpyxl.l

  • python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例

    这篇文章主要介绍了python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 贴上一个例子,里面设计很多用法,根据将相同日期的某些行合并处理. from openpyxl import Workbook from openpyxl.styles import Font, Fill, Alignment, Border, Side, PatternFill from handle

  • python opencv设置摄像头分辨率以及各个参数的方法

    1,为了获取视频,你应该创建一个 VideoCapture 对象.他的参数可以是设备的索引号,或者是一个视频文件.设备索引号就是在指定要使用的摄像头.一般的笔记本电脑都有内置摄像头.所以参数就是 0.你可以通过设置成 1 或者其他的来选择别的摄像头.之后,你就可以一帧一帧的捕获视频了.但是最后,别忘了停止捕获视频.使用 ls /dev/video*命令可以查看摄像头设备 2,cap.read() 返回一个布尔值(True/False).如果帧读取的是正确的,就是 True.所以最后你可以通过检查

  • 在双python下设置python3为默认的方法

    如何在双python下设置python3为默认 在C:\Program下举例 第一步安装好python2和python3后设置好环境变量 第二步去掉python2根目录下的python.exe文件,还有Scripts文件夹下的pip.exe文件 第二步复制python3根目录下的python3.exe文件新建python.exe,还有Scripts若不存在pip.exe,则复制pip3.exe新建pip.exe 执行结果如下,则说明配置成功 总结 以上所述是小编给大家介绍的在双python下设置

  • Python DataFrame设置/更改列表字段/元素类型的方法

    Python DataFrame 如何设置列表字段/元素类型? 比如笔者想将列表的两个字段由float64设置为int64,那么就要用到DataFrame的astype属性,举例如图: 该例列表为"m_pred_survived"字段为"PassengerId"及"Survived",设置为int64类型,最后可以输出检验下是否正确. m_pred_survived = pd.DataFrame(columns=['PassengerId', '

  • Python爬虫设置代理IP(图文)

    在爬虫的过程中,我们经常会遇见很多网站采取了防爬取技术,或者说因为自己采集网站信息的强度和采集速度太大,给对方服务器带去了太多的压力. 如果你一直用同一个代理ip爬取这个网页,很有可能ip会被禁止访问网页,所以基本上做爬虫的都躲不过去ip的问题. 1.我们在做爬虫的过程中经常会遇到这样的情况,最初爬虫正常运行,正常爬取数据,一切看起来都是那么美好,然而不久之后可能会出现错误,比如 403 Forbidden,这时候你打开网页一看,可能会看到"您的 IP 访问频率太高"这样的提示.出现这

  • Python DataFrame 设置输出不显示index(索引)值的方法

    在输出代码行中,加入"index=False"如下: m_pred_survived.to_csv("clasified.csv",index=False) 以上这篇Python DataFrame 设置输出不显示index(索引)值的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

随机推荐