#___Author___:FENG
#___DATE_____:2020/6/30
# 需求:设计一个发随机红包的程序
# 01 定义一个类:发红包的人和抢红包的人
# class People()
# 发红包: 人 发一个红包 ,里面存着send_m元,分成send_n份。 红包金额不得小于0.01,份数不得小于1
# 抢红包: 抢红包的金额是随机的,保留小数点2位。
# 未完成需求项
# 1/ 当发的金额足够小时,抢的金额大于发的金额 例如 0.03的红包,发4份.分别为:0.01,0.01,0.01,0.02
# 2/ 抢红包结束时,在最后输出全场手气最好的人
#红包未被抢完,不显示 全场手气最好的人
# 知识点总结:
# 1/ 面向对象---实例化,方法的调用,方法内变量的调用----------封装性
# 属性可以在内部更改,但无法通过对象调用新值 局部变量和全局变量
# 2/ max 函数
# 3/ for /if /while / break 的应用
# 4/ 格式化输出
# 5/ 随机数--import random random.randint random.uniform random.choice
# 6/ 取概率值
# 7/ 小数的应用 round(值,保留的小数位数)
# 8/ input 输入为字符串类型
# 9/ 列表 字典的简单应用
# 10/ 异常处理
import random
class People(): #定义一个人类,可以抢红包,也可以发红包
def __init__(self,name):
self.name = name # 定义属性:name
def send_money(self): # 定义发红包方法行为
while True:
self.send_m = float(input('请输入红包金额:')) # 输入发红包金额
if self.send_m < 0.01 :
print('您输入的金额不符合规范,请输入≥0.01的金额') #金额最小数额为0.01
else:break
while True:
try:
self.send_n = int(input('请输入红包个数:')) # 输入发红包个数
except ValueError:
print('您输入的数量为小数,请输入整数') #红包个数对应抢红包的人数,故不得为小数
continue
if self.send_n <= 0 :
print('您输入的数量不符合规范,请输入大于零的红包个数') #红包个数不得为负数
elif self.send_m/0.01 < self.send_n:
print('请输入小于等于%s的红包个数' % (int(self.send_m/0.01))) #红包的个数需保证每人最少分得的金额≥0.01
else:break
print('%s老板发了一个总金额%s元的红包,共分成%s份' % (self.name, self.send_m, self.send_n))
global list1
list1 = [] # 定义全局变量,存放随机优化后的钱
list2 = [] #存放随机数
global nb_m #定义变量 值等于金额最大红包
nb_m = 0
global nb_name
nb_name = 0
i = 0
sum_num = 0
while True:
while i < self.send_n: # 定义循环,发一次红包,每人随机抢到金额
r_num = random.randint(1,100)
list2.append(r_num)
sum_num += r_num
i += 1
j = 0
for j in range(0,len(list2)):
list1_m = round(self.send_m*list2[j]/sum_num,2)
list1.append(list1_m)
j+=1
if 0 in list1:
i = 0
sum_num = 0
list2 = []
list1 = []
else:break
nb_m = max(x for x in list1)
def recieve_money(self): # 定义抢红包方法
self.recieve_m = random.choice(list1) # 在列表中随机抽取一个红包
print('%s抢到了%s元钱'% (self.name,self.recieve_m))
list1.remove(self.recieve_m) # 在列表中去掉已经抢走的金额
if len(list1) != 0: # 显示剩余未被抢红包数量
print('还有%s个红包没有被抢' %len(list1))
else:
print('最后一个红包被%s抢走了!'%self.name) # 提示红包已经被抢光了
if self.recieve_m == nb_m:
nb_name = self.name
print('%s全场手气最佳,抢得最大红包%s元'%(nb_name,nb_m))
if __name__ == '__main__':
try:
dict_1 = {'xm':'小明','xg':'小刚','xh':'小红','xl':'小亮'}
xm = People('小明')
xm.send_money()
for key,value in dict_1.items():
key = People(value)
key.recieve_money()
except Exception:
pass