【SAS宏】拼手气红包该怎么抢?让微信红包的随机算法来告诉你

摘要:看到一篇讲微信拼手气红包算法的,又回想起今年抢红包屡败屡战,手气捉急,所以用SAS实现了一下抢红包算法,一探究竟。

推荐阅读:微信红包的随机算法是怎样实现的?

算法如下 每个红包的金额在0.01剩余平均值*2之间产生。

例如:发100块钱,总共10个红包,那么平均值应该是10块钱一个,那么第一个抢到红包的额度在0.01-20元之间随机确定。又当前面3个红包总共被领了40块时,剩下60块钱,总共7个红包,那下一个抢到红包的额度在0.01-(60/7*2)=17.14之间。

根据以上算法编写了以下SAS程序进行红包分配模拟,红包金额,红包份数以及模拟次数均可自行定义。

(注:这里有个假设,那就是流传出来的算法是正确的)

红包模拟分配SAS代码

%macrorandomdata(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, 以此类推):

【SAS宏】拼手气红包该怎么抢?让微信红包的随机算法来告诉你

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

【SAS宏】拼手气红包该怎么抢?让微信红包的随机算法来告诉你

我们看到金额的样本均值并不随着抽取红包的先后顺序有显著波动,而标准差则随着红包抽取的进行而逐渐增大。这也体现在最大最小值上,由于红包金额的最小值在算法中固定为0.01,因此抽取顺序并不会显著影响样本最小值,但是随着越来越多参与者的抽取,后面抽取红包的参与者反而获得了一些取得高收益的可能性,但这也得归功于前面人的“坏运气”。

进一步,我们再来看一下这10个参与者获得的红包金额分布情况,下图中分别展示了这1000次模拟结果中各rank的最小值,5分位数,25分位数,平均数,75分位数,95分位数以及最大值。另外,人均期望值100也被用灰色直线标注。

【SAS宏】拼手气红包该怎么抢?让微信红包的随机算法来告诉你


通过上图可以看到每个rank的样本均值和我们的人均期望值100并没有显著区别,也就是说抽取红包的先后顺序并不影响期望的抽取金额。这也证实了微信红包分配在算法上的公平性。

然而,样本的各分位数则有一些细微的升降趋势,如5分位数,25分位数和75分位数的样本均值随着抽取红包的循序而有轻微的下降,相反,95分位数和最大值则随着抽取动作的进行而增大。

下面我们比较一下第一人和最后一人(第十人)的样本金额分布情况:

【SAS宏】拼手气红包该怎么抢?让微信红包的随机算法来告诉你

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

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

【SAS宏】拼手气红包该怎么抢?让微信红包的随机算法来告诉你

那我可以很负责任地说,根据微信红包的分配算法,抢到198.9块的哪位碰到了可能性为0.55%的好事(红包金额大于等于198.9元),而你则是碰上了可能性为0.55%的霉事(红包金额小于等于1.1元)。。。

本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「我们」留言处理。

(1)
张乐的头像张乐编辑
上一篇 2016-04-04 19:19
下一篇 2016-04-16 23:21

相关文章

关注我们
关注我们
分享本页
返回顶部