前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个关于红包的问题引发的python算法初体验

一个关于红包的问题引发的python算法初体验

作者头像
云飞
发布2018-09-14 16:42:29
7380
发布2018-09-14 16:42:29
举报
文章被收录于专栏:云飞学编程云飞学编程

有个初学python的小伙伴,在群里问我关于实现抢红包的算法的问题,于是就有了以下对话

这里,这位同学的思路是这样的:

每次抢到的金额 = 随机区间 ( 0.01, 剩余金额 )

为什么我这样说呢?我们来举个栗子:

假设10个人抢100元的红包:

第一个人随机的范围是(0.01,100),平均是50元,假如第一个人抢到了50元,

第二个人随机的范围是(0.01,50),平均是25元,如果这个人抢到了25元,那往下推的话,就会发现第三个人的范围是(0.01,25)……

越往后金额越低,我们写段代码来看看

我们的思路是这样的:

剩余红包金额为M,剩余人数为N,那么有如下公式:

每次抢到的金额 = 随机区间 (0.01, M / N X 2)

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

举个栗子:

假设有10个人,红包总额100元。

100/10X2 = 20, 所以第一个人的随机范围是(0.01,20 ),平均可以抢到10元。

假设第一个人随机到10元,那么剩余金额是100-10 =90 元。

90/9X2 = 20, 所以第二个人的随机范围同样是(0.01,20 ),平均可以抢到10元。

假设第二个人随机到10元,那么剩余金额是90-10 =80 元。

80/8X2 = 20, 所以第三个人的随机范围同样是(0.01,20 ),平均可以抢到10元。

以此类推,每一次随机范围的均值是相等的。

我们来写代码实现一下:

大致思路如下:

先将红包m分成n份,然后随机n次取出红包

这里有2个地方需要注意:

出现重复的处理办法

尽可能的降低时间和空间的复杂度

这里就不写代码了,大家有兴趣可以去研究下哦!

这里要说明下,微信或者QQ的红包规则很可能就是最后一种方式,当然没有见过代码也说不准,大家有兴趣可以找找相关资料的!

欢迎大家来和我一起研究算法,研究python,交流学习哦!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云飞学python 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档