求解答一下吧!抢红包问题:当输入都是100时,最后结果总会有0.00希望每个结果最低有一分钱

 使用随机数random实现抢红包算法
1.假设红包总金额和点个数为工和
2.第1到第M-1个红包金额为剩余金额/(2至剩余红包个数之间的随机数)
3.最后一个红包的金额是全部剩余金额
import random
T=intinput"请输入红包总金额:))
M= intinput"请输入红包总个数:))
y=0
count
whileM!=1:
         random.randint(2.)
    y=T/a #抢到的金额数
                  #剩余金额
     S 十二
    M-=
    printf第{s}个红包金额为:fy:.2fprintf第{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))

img

当然,这个算法不够友善,1分钱的人很多,另一种方式,可以这么搞,100元按1万分算,然后扔到列表里,并按数字从大到小排列,每次将最大的数移除,然后分成两个不等于0的数补到列表中,直到列表中分配数量达到指定数量