春节期间,很多微信群,一夜间变成了“红包群”。微信中的“拼手气红包”带有随机性,随机性增加了参与抢红包的刺激性和娱乐性,甚至被人利用当成“赌博”的道具。

本来中国人过年,发红包是常事,图喜庆,开心,也无需计较什么得失。但在有些微信群里,搞红包接龙,则使得红包变味。

玩法1:群主先发S元红包,随机分成n份(n为群里人数),手气最佳者(即抢得红包最大者)继续发红包,也为S元,n份,下一个手气最佳者继续……

这种玩法较为简单。从短期来看,每人每次抢得红包金额有多有少。从长期来看,每玩一次,每人抢得金额的最大可能性为S/n元;而每次抢,都有可能成为手气最佳者,可能性为1/n,需要接着发出S元红包。这样看来,每人每次收益的期望值是:S/n-1/n×S=0。长期来看,这样玩法属于零和游戏,大家没输没赢。当然这只是理论分析,事实上会有些差别。

如果只是图个乐呵,可以用上述玩法。但如果考虑得失,就会有问题了。因为要长期来看,大家才是基本持平。但短期来看呢,譬如取极端值,只玩一次,第一个发红包的群主不就亏了么?就算再多玩几次,群主也很难回本。于是群主提出要抽成。

玩法2:群主先发S元红包,随机分成n份(n为群里人数),手气最佳者(即抢得红包最大者)需要向群主交“好运费”a元,然后继续发红包,为S元,n份,下一个手气最佳者继续……

这样,从长期来看,每人每次抢得金额的最大可能性为S/n元;而每次抢,都有可能成为手气最佳者,可能性为1/n,需要接着发出S元红包,交“好运费”a元。也就是每人每次收益的期望值为:S/n-1/n×(S+a)=-a/n。这样分析就会发现,看似每一次抢红包,各人抢多抢少,有输有赢,实则每个人都是输家,每次输a/n,这钱被群主赚了。玩得次数越多,群主一人独赚的可能性就越大。当然这只是理论分析,事实上会有些差别。

还有其他的玩法,譬如手气最佳者特定倍数接龙。群主率先在群内发出第一个拼手气红包(几个至几十个不等),手气最佳者按照所获得的金额乘以相应的倍数(从几倍到几十倍不等)接力发红包,以此类推,不断循环。

这样玩分析起来就更复杂了。但总的一条,如果微信系统是真的随机,玩家也没人作弊,也没抽成,即钱总是转来转去的话,那么最终基本上是持平的。但一旦有抽成,哪怕每次抽很少,最后所有赌资都将流向群主一人。



突发奇想给校友微信群发了红包,我设定红包总额为10元,支持28个人随机领取

于是一个有趣的结果出现了

A 领取了 0.26元
B 领取了 0.29元
C 领取了 0.02元
D 领取了 0.56元
E 领取了 0.64元
……

微信是采用什么样的算法做到的?简单百度了下,目前尚未有官方的说明,仅仅在知乎里有一个较为热门的讨论《微信红包的随机算法是怎样实现的?》,链接,https://www.zhihu.com/question/22625187 不过他们讨论的太过于深入,有掉坑之嫌。

我按照自己的逻辑尝试了下,这个算法需要满足以下几点要求
1、每个人都要能够领取到红包;
2、每个人领取到的红包金额总和=总金额;
3、每个人领取到的红包金额不等,但也不能差的太离谱,不然就没趣味;
4、算法一定要简单,不然对不起腾讯这个招牌;

正式编码之前,先搭建一个递进的模型来分析规律

设定总金额为10元,有N个人随机领取:
N=1
则红包金额=X元; N=2
为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数
第二个红包=10-第一个红包金额; N=3
红包1=0.01至0.98之间的某个随机数
红包2=0.01至(10-红包1-0.01)的某个随机数
红包3=10-红包1-红包2 ……

至此,规律出现啦!开始编码!

header("Content-Type: text/html;charset=utf-8");//输出不乱码,你懂的
$total=10;//红包总额
$num=8;// 分成8个红包,支持8人随机领取
$min=0.01;//每个人最少能收到0.01元for ($i=1;$i<$num;$i++)
{$safe_total=$total-($num-$i)*$min;//随机安全上限$money=mt_rand($min*100,$safe_total*100)/100;$total=$total-$money;echo '第'.$i.'个红包:'.$money.' 元,余额:'.$total.' 元 <br/>';
}
echo '第'.$num.'个红包:'.$total.' 元,余额:0 元';

输入一看,波动太大,这数据太无趣了!

第1个红包:7.48 元,余额:2.52 元
第2个红包:1.9 元,余额:0.62 元
第3个红包:0.49 元,余额:0.13 元
第4个红包:0.04 元,余额:0.09 元
第5个红包:0.03 元,余额:0.06 元
第6个红包:0.03 元,余额:0.03 元
第7个红包:0.01 元,余额:0.02 元
第8个红包:0.02 元,余额:0 元

改良一下,将平均值作为随机安全上限来控制波动差

header("Content-Type: text/html;charset=utf-8");//输出不乱码,你懂的
$total=10;//红包总额
$num=8;// 分成8个红包,支持8人随机领取
$min=0.01;//每个人最少能收到0.01元for ($i=1;$i<$num;$i++)
{$safe_total=($total-($num-$i)*$min)/($num-$i);//随机安全上限$money=mt_rand($min*100,$safe_total*100)/100;$total=$total-$money;echo '第'.$i.'个红包:'.$money.' 元,余额:'.$total.' 元 <br/>';
}
echo '第'.$num.'个红包:'.$total.' 元,余额:0 元';

输出结果见下图

第1个红包:0.06 元,余额:9.94 元
第2个红包:1.55 元,余额:8.39 元
第3个红包:0.25 元,余额:8.14 元
第4个红包:0.98 元,余额:7.16 元
第5个红包:1.88 元,余额:5.28 元
第6个红包:1.92 元,余额:3.36 元
第7个红包:2.98 元,余额:0.38 元
第8个红包:0.38 元,余额:0 元

参考:http://blog.cqcoder.com/微信红包的算法实现探讨/

微信红包接龙的数学分析相关推荐

  1. php 微信红包接龙源码_PHP生成微信红包

    PHP生成微信红包 1.[代码][PHP]代码/** * @param $total [你要发的红包总额] * @param int $num [发几个] * @return array[生成红包金额 ...

  2. 微信怎么接龙?手把手教你使用微信群接龙功能

    微信群接龙功能怎么用?每次微信更新或许会修复之前的一些bug,或许会给我们提供一些新的功能,最近有个功能引起非常多网友的热议:微信群接龙.这个新功能怎么用?今天小编带大家一起了解一下. 微信群接龙适用 ...

  3. 微信群内接龙的excel公式处理

    最近有个微信群内接龙,格式是这样的: 接龙 1. 张三,今日上午卖3.4万元,中午卖1.34万元,下午卖2.54万元. 2. 李四:上午1.2万元,中午18万元,下午0.5万元. 3. 王五一 上午0 ...

  4. 龙之谷2微信哪个服务器,龙之谷2微信区

    龙之谷2微信区是一款由腾讯出品原班人马打造的龙之谷正统续作动作奇幻RPG手游.找到属于自己的快乐与故事!曾经许下的约定,终于到了实现的时刻,龙之谷再登移动端,超爽快的动作体验,绚丽的技能特效,海量免费 ...

  5. 安卓收藏功能怎么实现_收藏!微信群接龙功能怎么操作?

    阅读本文前,请您先点击上面蓝色字体,再点关 注这样您就可以继续免费收到文章了,每天有互动问答,欢迎关注回答! 1.打开任意一个微信群,点击"查看接龙",群内成员就可以以接龙的方式自 ...

  6. 苹果输入法微信换行及微信群接龙

    一直不知道微信聊天中,如何使用苹果输入法输入换行符,今天琢磨了一下,终于有了结果. 在文字输入框中,单击一下,会弹出如下图所示的黑框,最后一个选项,即换行. 输入接龙文字后,输入换行,再输入1,即会触 ...

  7. 微信群内接龙如何保持队形

    在微信群里遇到接龙的时候,经常看到发出来的接龙下方有个灰色的小标注"查看接龙",就是这样子, 一时好奇,百思不得其解,终于弄明白这是怎么生出来的,其实很简单,我们只要在群聊天的输入 ...

  8. 处理微信里接龙名单,看看谁没有参加接龙

    微信里经常有家长需要接龙表明参与了某件事的讨论.可是一个班几十个学生,如果有两三个没有接龙,用眼睛看还真容易看花眼.于是写了个Python程序来分析接龙数据,找出哪个家长还没有参加接龙. 标准名单保存 ...

  9. 快速微信群内接龙统计避免刷屏

    微信群内通知经常需要接龙,或者经常发布通知统计收到人员很费劲怎么办?别担心往下看, [消息签发助手]3步帮您轻松解决. 好了给大家说一下具体办法,3步超简单 1.微信内搜索关注小程序[消息签发助手] ...

最新文章

  1. 从试用到使用:计算机视觉产业新一轮发展的起步年
  2. 虚拟机安装以及PCL的配置(1)
  3. 给Tomcat打开远程debug端口
  4. SAS线缆为什么这样多
  5. php sql好处,关于php:使用Doctrine与SQL相比,使用DQL有什么好处?
  6. js 条码枪扫描_年会展台 精彩不断 | 沧田:从打印到扫描录入 国产品牌从未停止...
  7. #pragma mark 基本使用
  8. Spring Aop(九)——基于正则表达式的Pointcut
  9. 现有php环境下安装memcached并测试(centos6.4系统64位)
  10. ceb怎么转换成word_win8.1系统将ceb文件格式转换成word的方法
  11. 计算机专业的核心课程,计算机专业核心课程
  12. 手机号归属地区编码_关于手机号码的详细解析~
  13. 英文学术论文写作常用词句积累
  14. 实时数据处理简单分析
  15. 英克软件结合oracle,英克科技医药行业销售管理系统
  16. 【基础】HBuilderX 找不到手机或模拟器设备(安卓端)
  17. Dart快速学习之路(完整版)
  18. Swin-Transformer网络结构详解
  19. 520,冰河亲自整理的Git命令汇总升级版,悄悄努力,然后惊艳所有人(升级版)
  20. QGIS 3.14|地震数据动画效果实战(二)动画设置篇

热门文章

  1. 废柴日记6:迟到的『构造最小生成树算法』③
  2. Quality Over Quantity: 更少一些,更好一些_第1页_福布斯中文网
  3. 白酒销售员必备的电话销售话术
  4. 基于华为的IP Sec
  5. Sec-Fetch-*请求头
  6. Vs2012 到 Vs2019 又增加什么小玩意,小伙伴是不是很好奇?
  7. 职场人如何用时间管理软件提升效率
  8. GRAINS: Generative Recursive Autoencoders for INdoor Scenes 2019 TOG(家居布局、树结构网络、RvNN)
  9. android 无线显示功能,华为手机的无线显示功能在哪,怎么使用?
  10. 线上招生太难?教育行业裂变方案奉上