鱼C论坛

 找回密码
 立即注册
查看: 3120|回复: 7

[作品展示] 思考一个小问题:微信群抢红包

[复制链接]
发表于 2017-1-18 09:12:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 jerryxjr1220 于 2017-1-18 11:50 编辑

现在微信群红包越来越多,也有越来越多的人热衷于强红包。

现在假设有一个10人的小群,每人每次出100元作为抢红包的本金,依次轮流。

抢红包分配规则:

每人抢的金额最少为0.01元,最大为(剩下金额/剩下人数)*2,每人最少可以分配到0.01元,最后一人拿完剩下所有的钱。

请设计这样的红包分配形式,以列表方式输出。

附加:如果有能力,请计算如果作为你参与其中,应该在什么时候去抢红包收益可以最大?(红包没有利息,也没有手续费)


解答:
程序输出应该没什么问题,建一个类用以生成红包分配列表。
规则就是除最后一个人之前的所有人抽取的红包金额,最小1分,最大为(剩下金额/剩下人数)*2;最后一人拿完剩下的钱。
为了便于计算采用“分”为单位。
例如输出:
[513, 781, 1478, 1370, 898, 268, 493, 1568, 850, 1781]

附加题:用10万次模拟抽红包,看平均收益。
下面列出50万次的模拟统计结果:
1~10万次:
第1个人的平均收益:1001
第2个人的平均收益:997
第3个人的平均收益:999
第4个人的平均收益:1001
第5个人的平均收益:1000
第6个人的平均收益:996
第7个人的平均收益:999
第8个人的平均收益:1002
第9个人的平均收益:998
第10个人的平均收益:1000

10~20万次
第1个人的平均收益:1005
第2个人的平均收益:999
第3个人的平均收益:1004
第4个人的平均收益:998
第5个人的平均收益:1000
第6个人的平均收益:994
第7个人的平均收益:998
第8个人的平均收益:995
第9个人的平均收益:1000
第10个人的平均收益:1001

20~30万次:
第1个人的平均收益:999
第2个人的平均收益:998
第3个人的平均收益:998
第4个人的平均收益:1002
第5个人的平均收益:998
第6个人的平均收益:999
第7个人的平均收益:999
第8个人的平均收益:1001
第9个人的平均收益:995
第10个人的平均收益:1006

30~40万次:
第1个人的平均收益:1003
第2个人的平均收益:1000
第3个人的平均收益:999
第4个人的平均收益:1000
第5个人的平均收益:1000
第6个人的平均收益:999
第7个人的平均收益:1001
第8个人的平均收益:998
第9个人的平均收益:996
第10个人的平均收益:1001

40~50万次:
第1个人的平均收益:1001
第2个人的平均收益:998
第3个人的平均收益:1001
第4个人的平均收益:1001
第5个人的平均收益:998
第6个人的平均收益:1001
第7个人的平均收益:1001
第8个人的平均收益:999
第9个人的平均收益:996
第10个人的平均收益:998

从大数据的统计来看,其实无论什么时候去抢,收益都是差不多的。
当然如果次数不足够多,那就完全取决于随机数的大小了(运气)

源代码:
游客,如果您要查看本帖隐藏内容请回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-16 20:32:44 From FishC Mobile | 显示全部楼层
本帖最后由 shigure_takimi 于 2018-1-17 08:19 编辑
  1. import random

  2. def divide(total = 10000, person = 10, n = 100000):
  3.         get = [0 for i in range(person)]
  4.         for j in range(n):
  5.                 amount = total
  6.                 for i in range(0, person-1):
  7.                         x = 2 * amount // (person - i)
  8.                         a = random.randint(1, x)
  9.                         get[i] += a
  10.                         amount -= a
  11.                 get[person-1] += amount
  12.         return [i//n for i in get]

  13. print(1, divide(n=1))
  14. print(2, divide(n=1))
  15. print('First 100,000 times simulation:',divide())
  16. print('Second 100,000 times simulation:',divide())

  17. #   输出:
  18. #  (1, [205, 593, 974, 69, 561, 696, 2725, 2736, 581, 860])
  19. #  (2, [157, 766, 894, 280, 1008, 2585, 1453, 90, 2353, 414])
  20. #  ('First 100,000 times simulation:', [998, 998, 1002, 1000, 1002, 1003, 998, 998, 999, 998])
  21. #  ('Second 100,000 times simulation:', [997, 1002, 1004, 997, 1000, 999, 997, 998, 1003, 998])
  22. #  可见单独一次来看,每个人抽到的金额差别比较大;但总体来看,先抽后抽没有差别。
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-15 18:08:23 From FishC Mobile | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-16 22:20:45 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-17 06:29:49 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-16 08:46:44 | 显示全部楼层
看下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-20 11:12:33 From FishC Mobile | 显示全部楼层
大佬,赶紧记下来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-31 00:42:35 | 显示全部楼层
牛皮
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 22:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表