【SAS宏】拼手气红包该怎么抢?让微信红包的随机算法来告诉你 | 数据分析网 首页 分类阅
时间: 2016-04-04来源:数据分析网
前景提要
摘要:看到一篇讲微信拼手气红包算法的,又回想起今年抢红包屡败屡战,手气捉急,所以用 SAS 实现了一下抢红包算法,一探究竟。
推荐阅读: 微信红包的随机算法是怎样实现的? 算法如下 每个红包的金额在0.01 和剩余平均值*2 之间产生。
例如:发100块钱,总共10个红包,那么平均值应该是10块钱一个,那么第一个抢到红包的额度在0.01-20元之间随机确定。又当前面3个红包总共被领了40块时,剩下60块钱,总共7个红包,那下一个抢到红包的额度在0.01-(60/7*2)=17.14之间。
根据以上算法编写了以下SAS程序进行红包分配模拟,红包金额,红包份数以及模拟次数均可自行定义。
(注:这里有个假设,那就是流传出来的算法是正确的) 红包模拟分配SAS代码
%macro randomdata(amount,share,count);
%dot=1%to&count;
data test&t;
do i=1;
x=ranuni(0);
up=&amount;
pay&t=up/(&share+1-i)*2*x;
rest=up-pay&t;
output;
end;
do i=2 to &share-1 by 1;
x=ranuni(0);
up=rest;
pay&t=up/(&share+1-i)*2*x;
rest=up-pay&t;
output;
end;
do i=&share;
x=0.5;
up=rest;
pay&t=up/(&share+1-i)*2*x;
rest=up-pay&t;
output;
end;
keep i pay&t;
run;
%end;
data test;
merge test1-test&count;
drop i;
run;
proc transpose data=test out=test0;
run;
%do m=1 %to &share;
proc means data=test0 mean std max min p5 p25 p75 p95;
var col&m;
output out=stat&m mean=mean std=std max=max min=min p5=p5 p25=p25 p75=p75 p95=p95;
run;
%end;
data stat;
set stat1-stat&share;
rank=_N_;
drop _type_ _freq_;
run;
%mend;

【Q:抢红包的先后顺序对红包金额有没有影响?】
从微信红包的随机算法自然引出对多人拼手气红包的以下猜测:
抢红包的先后顺序 对红包金额有一定的影响,之前抽取红包的人运气越好,下一个抽取的随机金额上界就越低,抽到大额红包的可能性就变小,反之亦然。
看似后抽取红包的参与者们获得的金额被前人们所控制着,那 实际情况 又是如何呢?通过代码对10人分享总金额1000元的红包进行1000次模拟。下表展示1000次模拟中的前5次(其中,第一个抢到红包的标记rank=1,第二个rank=2, 以此类推):

对于每个rank的1000条样本结果进行单因素分析结果如下:

我们看到金额的 样本均值并不随着抽取红包的先后顺序有显著波动 ,而 标准差则随着红包抽取的进行而逐渐增大 。这也体现在最大最小值上,由于红包金额的最小值在算法中固定为0.01,因此抽取顺序并不会显著影响样本最小值,但是随着越来越多参与者的抽取,后面抽取红包的参与者反而获得了一些取得高收益的可能性,但这也得归功于前面人的“坏运气”。
进一步,我们再来看一下这10个参与者获得的红包金额分布情况,下图中分别展示了这1000次模拟结果中各rank的最小值,5分位数,25分位数,平均数,75分位数,95分位数以及最大值。另外,人均期望值100也被用灰色直线标注。

通过上图可以看到每个rank的样本均值和我们的人均期望值100并没有显著区别,也就是说抽取红包的先后顺序并不影响期望的抽取金额。这也证实了微信红包分配在算法上的公平性。
然而,样本的各分位数则有一些细微的升降趋势,如5分位数,25分位数和75分位数的样本均值随着抽取红包的循序而有轻微的下降,相反,95分位数和最大值则随着抽取动作的进行而增大。
下面我们比较一下第一人和最后一人(第十人)的样本金额分布情况:

很明显,根据算法,第一参与者的抽取金额均匀分布与(0,200)之间,而最后一人的抽取金额则为一个偏态分布。相比先前抽取红包的人,最后一人有着更大的机会获得大金额红包,同时也有更大的机会获得小金额红包。样本分布的变化同样很好的解释了上文中各分位点的变化趋势。

综上所述,抢红包的先后顺序对红包金额的“期望”并没有影响,也就是说微信红包的分配算法对每个参与者是公平的,但是抢红包的先后对金额的波动率,也就是“风险”有一定影响,参与者可以根据自己的风险偏好选择适合自己的领取顺序。“保守型”参与者尽量早些下手,以获得一个均匀分布于期望人均金额附近的收入,而“激进型”参与者则可以选择晚些下手(当然晚下手还得承受红包被领完的风险哦),这样可以争取到更多的获得大额红包的机会,但是同时也增加了获得小额红包的可能性。另外,还有朋友问我:为什么200的红包只能拿到1块1?!

那我可以很负责任地说,根据微信红包的分配算法,抢到198.9块的哪位碰到了可能性为0.55%的好事(红包金额大于等于198.9元),而你则是碰上了可能性为0.55%的霉事(红包金额小于等于1.1元)。。。
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「 我们 」留言处理。

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

热门排行