使用随机数random实现抢红包算法
1.假设红包总金额和点个数为工和
2.第1到第M-1个红包金额为剩余金额/(2至剩余红包个数之间的随机数)
3.最后一个红包的金额是全部剩余金额
import random
T=int(input("请输入红包总金额:))
M= int(input("请输入红包总个数:))
y=0
count
whileM!=1:
random.randint(2.)
y=T/a #抢到的金额数
#剩余金额
S 十二
M-=
print(f第{s}个红包金额为:fy:.2f)
print(f第{S+1个红包金额为:{T:.2f)
第94个红包金额为:0.01
第95个红包金额为:0.01
第96个红包金额为:0.00
第97个红包金额为:0.00
第98个红包金额为:0.00
第99个红包金额为:0.00
第100个红包余额为:0.00
随机数范围你要考虑还剩多少个红包,每个至少0.01,所以你至少要保留这些钱
然后如果剩余人数等于剩余钱数的分值,就不要随机了,每人0.01就结束了
其实是分配思路的问题,如果有T个人,分M元钱,为保证每个人最少得到1分钱,那么就需要在随机的时候,为每个人至少保留1分钱
import random
T=100 # 有多少人分钱
M=100 # 一共分多少钱(元)
def randomCredit(num,money): # 随机分钱,参数为分钱人数num和钱的面额(分)
if num == 1: # 如果只有1个人分钱,则返回剩余的所有金额(返回的是列表)
return [money]
else:
a = int(num//2) # 如果多个人分钱,则分成两波,人数整除2一波,另一波是剩余人数
b = num - a
c = random.randint(a, money-b) # 得出整除2的一波分多少钱,最大数需要提出到剩余人数保留的1分钱
#print(a,c,b,money-c)
return randomCredit(a, c)+randomCredit(b, money-c) # 以递归的方式得到这两波人的分钱的数量
lst = randomCredit(T, M*100)
print(sum(lst))
lst.sort(reverse=True)
lst = [n/100 for n in lst]
print(lst)
print(lst.count(0))
当然,这个算法不够友善,1分钱的人很多,另一种方式,可以这么搞,100元按1万分算,然后扔到列表里,并按数字从大到小排列,每次将最大的数移除,然后分成两个不等于0的数补到列表中,直到列表中分配数量达到指定数量