面试中算法(红包算法)

一、问题需求:

   一个人在群里发了1个100元的红包,群里有5个人一起来抢红包,每人抢到的金额随机分配。

红包功能需要满足哪些具体规则呢?

1、所有人抢到的金额之和要等于红包金额,不能多也不能少。

2、每个人至少抢到1分钱。

3、要保证红包拆分的金额尽可能分布均衡,不要出现两极分化太严重的情况。

 方法1:二倍均值法

假设剩余红包金额为m元,剩余人数为n,那么有如下公式:

每次抢到的金额=随机区间[0.01,m/n×2-0.01]元

这个公式,保证了每次随机金额的平均值是相等的,不会因为抢红包的先后顺序而造成不公平。

import random
def redPackage(money,people):
    '''
    使用二倍均值法:抢红包
    :param money: 总金额
    :param people: 总人数
    :return:
    '''
    #存入随机金额
    ll=[]
    #剩余金额
    rest_money=money
    #剩余人数
    rest_people=people
    #循环人数
    for i in range(people-1):
        #随机范围:[0.01,m/n×2-0.01]
        amount=random.randint(1,int(rest_money/rest_people*2)-1)
        #剩余金额=剩余金额-随机金额
        rest_money-=amount
        #剩余人数=剩余人数-1
        rest_people-=1
        #添加到列表中
        ll.append(amount)
    #将最后一个剩余金额添加到列表中
    ll.append(rest_money)
    # print(ll)
    return ll

if __name__ == '__main__':
    #100元5个人抢
    ll=redPackage(10000,5)
    # 1元2个人抢
    # ll=redPackage(100,2)
    for i in ll:
        print(f'抢到:{i/100}元')

 

 

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值