【字节面试】随机分配红包

题目描述:

将固定金额的红包随机分配给n个人

自行处理输入输出


解题思路:

1.确认固定金额和人数为控制台输入

2.分配金额:

        ·先固定最小、最大红包金额

        ·再根据最大红包金额*随机数,生成一个随机红包金额

        ·最后一个红包金额=总金额-已分配金额


        代码部分

import random
import math
import decimal
def Rand_packet(money , num):
    List_1 = []
    while num > 1:
        min_money = 1       #红包最小为1
        max_money = money / num * 2     #红包最大为平均数2倍
        # 随机生成一个红包金额
        # random_money = math.floor(max_money * random.random())
        #另一种随机生成红包方法
        random_money = round(max_money * random.random(), 3)        #3为舍入到小数点后的位数,即保留3位小数
        packet_money = min_money if random_money < min_money else random_money      #生成红包< 1则直接更换为最小值,> 1则保持生成值
        List_1.append(packet_money)     #列表中添加每个红包的金额
        money = round((money - packet_money), 3)       #计算剩余金额
        num -= 1        #计算剩余人数
    List_1.append(money)        #最后一人红包
    return List_1

if __name__ == "__main__":
    money, num = map(int, input().split())
    packet = Rand_packet(money, num)
    print(packet)
    print(sum(packet))

此题为博主面试遇到的题,面试题与笔试不同,题目可以有各种各样的解法和输入输出处理

知识点:主要考察将其转化为数学问题的能力


其他思路

"二倍均值法",即每次随机分配一个红包金额,剩下的金额再继续分配给剩下的人,保证每个人至少能得到 1分钱,且最后一个人拿到剩余的所有金额。

解题思路:

1.确认固定金额和人数为控制台输入

2.分配金额:

        ·假设当前剩余金额为 total_amount,剩余人数为 remaining_people

        ·对于每个人,随机分配的金额在 [0.01,(total_amount/ remaining_people)×2−0.01] 的范围内。

        ·最后一个人得到剩余的所有额。


代码部分

def Rand_packet_remaining_people(total_aomount, n):
    if n <= 0:
        raise ValueError("people must > 0")
    if total_aomount <= 0:
        raise ValueError("money must > 0")
    money = []
    for i in range(n - 1):
        max_money = total_aomount /(n - i) * 2
        rand_money = random.uniform(0.01, max_money)        
        #随机生成的一个浮点数,范围在[0.01, max_money)之间
        money.append(rand_money)
        total_aomount -= rand_money
    money.append(total_aomount)     #最后一人获取剩余所有money
    return money

if __name__ == "__main__":
    money, num = map(int, input().split())
    try:
        money_people = Rand_packet_remaining_people(money, num)
        for i, m in enumerate(money_people, 1):
            print('people {} get {:.3f}'.format(i, m))
    except ValueError as v:
        print(v)

结语:越简单的题目解法应该越多,请路过大神留下新的思路供本小白学习一下,打开思路

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值