标签:用户 技术 .com password 马虎 博客 实现 性能 错误
1.红包的最小金额0.01
2.红包的数量
3.红包总金额
4.红包需要一个ID号(存储数据库的时候需要使用)
5.每个红包的金额
1 def __init__(self): 2 self.min = 0.01 # 红包最小金额 3 self.nums = 1 # 红包数量 4 self.money = 0 # 红包总金额 5 self.ID = [] # 为每一个红包分配一个ID号。 6 self.evePm = [] # 每个红包的分配金额
while self.money / self.nums < 0.01: self.money = float(input("请输入红包金额:")) self.nums = int(input("请输入红包数量:")) if self.money / self.nums < 0.01: print("输入不符合红包规则,请重新输入")
这里需要提示一下,在获取金额和数量的是时候一定要进行类型转换,否则会报类型错误。
for i in range(self.nums): # 简单的红包分配计算方法 if i != self.nums-1: safe_total = (self.money - (self.nums - i) * self.min) / (self.nums - i) # 随机安全上限 evemoney = random.randint(self.min * 100, int(safe_total * 100)) / 100 self.money -= evemoney else: evemoney = round(self.money, 2) # 精确到小数点后两位 self.evePm.append(evemoney)
在红包分配的时候有几个地方需要注意。第一个是利用这个计算方法分配红包时一定要有判断,因为如果没有判断,而是直接算出每个红包的金额,你会发现所有红包的金额加起来不等于总红包金额。原因也是随机数惹的祸。第二个虽然进行了判断,但是当红包金额有点大时,最后一个红包的金额会精确到小数点后好多位。这是很多语言都有的问题。那么就要强制精确到后两位。这样还是总金额嘛?放心,是的。
pool = redis.ConnectionPool(host=‘127.0.0.1‘, password=‘‘) # 创建redis连接池 r = redis.Redis(connection_pool=pool) # 创建redis连接
全局创建redis连接池
self.ID = [i for i in range(self.nums)] # 为每一个红包分配id red_dic = zip(self.ID, self.evePm) # 将id号与红包进行绑定 # for i, j in red_dic: # print("id:{} 金额:{}".format(i, j)) for i, j in red_dic: r.set(i, j)
将红包数据存储到数据库
def __init__(self, nums): self.ID = [] # 每个人的id self.nums = nums # 红包个数 def get_red(self): pnums = int(input("请输入有多少人参与抢红包:")) self.ID = [i for i in range(pnums)] random.shuffle(self.ID) # 将id进行随机打乱,模拟抢红包前后顺序 if pnums > self.nums: # 红包数小于人数 for i in range(pnums): if i < self.nums: print("id为{}的用户抢到了{}元".format(self.ID[i], r.get(i).decode("utf-8"))) else: print("id为{}的用户未抢到红包".format(self.ID[i])) else: for j in range(pnums): print("id为{}的用户抢到了{}元".format(self.ID[j], r.get(j).decode("utf-8"))) print("还有{}个红包未被抢".format(self.nums - pnums))
这里的代码没有一点点的难度,仔细看都看得懂得。我就不做解释了。
想获取程序源代码,请点击获取
标签:用户 技术 .com password 马虎 博客 实现 性能 错误
原文地址:https://www.cnblogs.com/xzk666/p/10581021.html