作业形式:
统计软件题目 8
个人作业,请写上各人的学号,姓名;
开始和结束作业时间:
群里通知,elearning 上也会有。
作业提交形式:
电子版
1. R 代码,文件名为“学号_姓名_题目 8.R”,注意格式清晰,代码可读性
好。源程序注释中标注学号、姓名。
2. pdf 文件,文件名为“学号_姓名_题目 8.pdf”,根据各小问回答问题。
作业内容:微信红包分配机制的模拟。
问题背景:毕导在《一席》中的演讲(https://www.bilibili.com/video/av16333208/ 或本题附 带图文)中说,为了找到微信内部“红包的金额分配和顺序之间的规律”,他做了一个试 验:用五个账号(不妨称其为甲、乙、丙、丁、戊)组了一个微信群,在群里按照“拼手 气红包”发放总额为 100 元的 5 个红包,让五个账号按随机顺序抢红包,并记录每个账号 拿到红包的顺序及其金额。
假定毕导重复了 10,000 次该试验,相关数据记录在一个 50,000 行 4 列的名为 X 的数 据框中,X 的每一行是某一账号在某一轮试验中拿到的红包顺序和金额信息,X 的各列的信 息分别是:
1) 试验序号,即第几次试验, 整数型,取值为 1-10,000;
2) 账号名,字符型,其取值范围为{“甲”,“乙”,“丙”,“丁”,“戊”};
3) 次序,在这轮试验中是第几个拿到红包的,整数型,取值为1-5;
4) 金额, 在这轮试验中拿到的红包金额,精确到小数点后 2 位,最小为 0.01。
在分析了这组数据后,毕导称,微信的“拼手气红包”分割算法是这样的:假定这个群 有 K 个人(K ≥ 3),发放K个红包,不存在不拿红包的现象。
那么第k个红包的金额𝑀𝑘 (k=1,2,…,K)满足以下规律: 1) 下限为 0.01元;
2) 上限为:
i. 当前所剩下的所有红包的总金额 × 2, 当前所剩下的所有红包的红包数
ii. 将其向下取整,精确到0.01元(同时上限需保证剩下的K-k个红包 每个都有至少 0.01 元。)
3) 该红包的金额𝑀𝑘服从上述上下限之间的均匀分布,四舍五入到分(0.01元)。 4) 如果是最后一个红包(k=K),则金额为当前剩下的金额。
作业问题:
(1) 请编写 R 函数(函数名称为 redbag),用毕导所总结的红包分割算法来模拟 N 次试
验。
函数的输入为:
1) 试验次数N,缺省值(default)为10,000; 2) 每次试验的红包的总金额S,缺省值为100; 3) 账号个数K,即微信群的人数,缺省值为5。
输出为:数据框 Y,各行各列的含义与数据框 X 相同。 注意:可以写一个函数,也可以写若干个子函数,再调用。
(2) 调用(1)中自定义的函数 redbag,分析输出结果:
1) 给定总金额S=100,红包个数K分别为5和10时,实验次数设为10,000次,
由 redbag 函数得到实验结果(输出的数据框 Y)。对k = 1,2, … , K,分别给出 第 k 个红包的金额的均值、标准差等描述统计量,并作图考察(提示:可作 出并列的 boxplot 来作比较几个统计量,或作出直方图比较它们的分布差 别)。
2) 请通过1)中的描述统计,简单描述第几个抢到红包的差异。
(3) 假定数据框 Y 已经生成,数据框 X 我们也拿到了,如何对毕导声称的算法进行统计 检验?写出该检验的原假设、备择假设,所用检验方法的名称,以及该检验的判断 依据。(提示:可验证微信内部“拼手气红包”得到的经验数据 X 的分布规律,与由 毕导声称的算法得出的经验数据 Y 的分布规律是否一致)(注:本小问仅需回答问题, 不需要编程)
以下节选自:https://www.sohu.com/a/205018319_324868
给大家讲另外一个故事,是一个关于抢红包的故事,也是我自己做的一个小探究。春节抢红 包大家都玩过,现在抢红包已经是我们每年过年的一个全民竞技体育了,每个人抢到那几分 钱都特别地开心。
但有段时间我发现了一个奇怪的现象,就是不管别人发多大的红包,抢到我手里的每次都只 有几分钱。而往往是抢红包比较晚的那些人,他们可以抢到一个比较大的红包。
这不科学吧?我说腾讯这么大的一个公司,它没有必要在算法上针对我呀。难道微信红包先 抢和后抢的规律是不一样的?想到这个想法我非常地兴奋,我觉得如果我最后能找到这个规 律的话,我就能抢到我所有的同学都破产为止。
马上又开始实验了。我在周围借来了四部手机,连上我自己的一部,总共是五部手机,建了 个五人群开始发红包。发红包之前我先做了这么一个先导实验:N 个人抢 N+1 分钱。
大家都学过抽屉原理,N 个人抢 N+1 分钱就应该有一个人抢到 2 分钱,剩下的人都抢到 1 分 钱。但实际做出来实验结果不是这样的,永远只有最后那个人才能抢到那个 2 分钱。
我做了非常多次实验,结果肯定是对的。这个东西我把它命名为末位红包抽屉原理。也就是 N 个人抢 N+1 分钱,则必有最后一个人抢到 2 分钱。这个收益率很可怕,他的收益率达到了 前面一个人的两倍。
这个结果虽然很简单,但是它反映出来一个现象,就是微信红包的内部算法肯定不是均匀的, 先抢后抢一定是有区别的,而且貌似后抢会占一点点优势。
究竟是不是这样呢?我做了一个进一步的实验。
我用 5 个人抢 50 块钱的红包,发了 150 次,然后统计了每一次这 5 个人的数据,得到这样 750 个数据。我把 750 个数据做在一张表上面。
大家可以看出来,很惊讶的一个结果:5 个人抢 50 块钱的红包,第一个人从来没有超过 20 块钱。做了 150 次,所以统计规律肯定是没有问题的。第二个人从来没有超过过 25 块钱, 等到第三第四第五的人他们能抢到的钱数慢慢才上去。
如果我们做一个统计学的分析,从平均值上来看,其实 5 个人抢到的钱差不多,都是在 10 块钱左右,5 个人抢 50 块钱嘛。但如果从它的标准差,就是一个波动的情况,你会发现标 准差越来越大。也就说第一个人可能只能抢到 0 到 20,第四第五的人才能抢到 0 到 50 中间 的任一个数字。
后来经过我仔细地研究,我终于发现了微信红包内部的算法规则是什么,每个人当前能抢到 的金额服从一个 0.01 到当前剩余均值两倍的左开右闭区间的均匀分布。
什么意思呢?大概是说,5 个人抢 50 块钱,那平均每个人能抢到 10 块钱。这个时候,第一 个人抢的时候,他就只能抢到 0—10×2 也就是 20 块钱。你想第一个人多不巧,他只抢到了 2 块钱。那接下来的问题就变成了 4 个人抢 48 块钱,这个时候平均每个人能抢到 12 块钱。 12 的两倍是 24,第二个人最大能抢到就变成 24 块钱。所以这个区间是一个不断放大的过 程。
最后等我发现了这个规律之后,你就可以做一些很无聊的脑洞。比如说你可以编程给自己发 红包,然后有一天我就给自己发了五千万个红包,得出来这样一个规律。
在五千万个红包下面这个规律就非常地明显了。你可以看到第 1 个人永远不会超过 20,后 面的这个规律分布在慢慢平缓下来。
此外,通过编程你还可以统计一个现象,就是最佳手气,这是很多人关注的一个点。最佳手 气在各个人各个位置的概率是均等的吗?其实也不是。最后我发现最佳手气的概率在 5 个 人抢的时候是依次递减的。
然后我的脑洞又发散了一下,我说难道 5 个人是这样,那几个人抢都是这样吗?于是我又做 了一个编程,很无聊,就给自己发了两亿个红包。最后做出来这样一张图。
这张图可以说是微信抢红包里面包罗万象,它把所有的情况都概括了。它统计出了从 3 个人 抢到 27 个人抢,如果你愿意的话,我可以统计到任何多个人抢。从 3 个人到 27 个人,不同 的人在抢红包的时候,每一个位置抢到手气最佳的概率这个变化究竟是什么样子的。
从这张图的最后我大概得出一个结论,就是通常抢红包的人比较多的时候,应该是越往后往 往抢到手气最佳的概率越大。所以以后我看到红包都先憋一会儿,我等你们先把前面的小红 包都抢走了,憋到后面我再去把那个大的捞回来。
后来在这种思想的指导下,我就再也没有抢到过红包。
所以你看完这些故事,觉得理工男的生活好像也蛮丰富多彩的。