|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
import random
def hongbao(total,num):
each=[]
already=0
for i in range(1,num):
t=random.randint(1,(total-already)-(num-i))
each.append(t)
already=already+t
each.append(total-already)
return each
if __name__=='__main__':
total=300
num=5
for i in range(10):
each=hongbao(total,num)
print(each)
哪个大神能帮忙详细解释一下这个程序,促进一下理解
能看懂但是自己写就不会了
本帖最后由 qq1151985918 于 2021-6-7 16:40 编辑
- # 首先要看懂整片代码的意义,得一句一句代码分析
- # 并且揣摩写代码人的用意
- # 这个代码是有比较明显缺陷的
- # 缺陷就是 越是前边领取红包的人领取的金额越大
- # 越是后边领取红包的人领取的金额越小
- # 代码案例中 取 num = 5 就已经很明显了
- # 预计代码如果取 num = 20 就没法看了
- # 加载模块
- import random
- # 定义函数 total 为红包总金额 num 为红包个数
- def hongbao(total,num):
-
- # each 这里的作用就是储存已经领取的红包金额和人数
- # 如果第一个人领取了 1 块钱,each 就变成 [1]
- # 如果第二个人领取了 2 块钱,each 就变成 [1, 2]
- each=[]
-
- # already 这里的作用是计算已经领取的红包金额
- # 如果第一个人领取了 1 块钱,already 就变成 1
- # 如果第二个人领取了 2 块钱,already 就变成 3
- # total-already 表示剩余未被领取的金额
- already=0
- # 这里用的 range(1,num) 其实是有深意的
- # 故意少算了一个红包,因为用这个代码
- # 无法保证最后一个人拿到全部的剩余金额
- # 所以在最后又单独加了一个 each.append(total-already)
- # 将全部剩余金额都分配给最后领取的人
- for i in range(1,num):
- # 我们知道 randint 的取值是比较特殊的
- # 一般我们认知的取值区间都是 左闭右开
- # 但是 randint 的取值是 全闭区间
- # 这也是为什么在上面说的要把红包分配少一个人的原因之一
- # 也是下边代码 最后 -(num-i) 的原因
- # 写代码的人的想法是,要保证领取红包的人最少能够领取 1 元
- # 不知道你能不能看懂
- # 全部代码最有深度的就是下边的这一行代码
- # 一定要把这一行代码吃透
- # 这一行代码保证了每个领取到红包的人最少领取到 1 块钱
- # total-already 表示剩余未领取的钱
- # range(1,num) 是取不到 num 的值的,只能取到 num - 1
- # 如果确实看不懂再问吧
- t=random.randint(1,(total-already)-(num-i))
- # 将已经领取的红包储存
- each.append(t)
- # 更新已经领取的金额 already
- already=already+t
- # 将最后剩余金额全部分配给最后一个领取到红包的人
- each.append(total-already)
-
- # 将红包信息返回
- return each
- if __name__=='__main__':
- total=300
- num=5
- # 模拟 10 次红包 均为 300 元 5 人
- for i in range(10):
- each=hongbao(total,num)
- print(each)
复制代码
|
|