题目描述:
将固定金额的红包随机分配给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)
结语:越简单的题目解法应该越多,请路过大神留下新的思路供本小白学习一下,打开思路