第一次写博客,好鸡冻!!《微信红包的算法实现探讨》

今天看来的。留给日后的我,可以有用。

--------------------------------------------------------我是分隔线---------------------------------------------------

微信红包的随机算法是怎样实现的?

RT。我考虑了一个简单的算法:
比如100元,由10个人分,那么平均一个人是10元钱。然后付款后,系统开始分份儿。
第一份:系统由0~10元之间随机一个数,作为这一份的钱数,设x1。
第二份:剩下的钱(100-x1),系统由0~(100-x1)/(10-1)随机一个数,作为这份的钱数,设x2
.。。。
第n份:剩下的钱(100-x1-x2-...-xn),系统由0~(100-x1-x2-...-xn-1)/(10-n)随机一个数,作为这个份的钱数,设为xn

当用户进来拿红包的时候,系统由0~9之间随机一个数,随机到几,就取第几份红包,然后将这个数存到list里。当之后的用户抽到相同的随机数时,则将这个数+1,如遇相同再+1,直至list满,红包发完。

------------------------------------------------
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:陈鹏
链接:https://www.zhihu.com/question/22625187/answer/85530416
来源:知乎

先上代码:

public static double getRandomMoney(LeftMoneyPackage _leftMoneyPackage) {
    // remainSize 剩余的红包数量
    // remainMoney 剩余的钱
    if (_leftMoneyPackage.remainSize == 1) {
        _leftMoneyPackage.remainSize--;
        return (double) Math.round(_leftMoneyPackage.remainMoney * 100) / 100;
    }
    Random r     = new Random();
    double min   = 0.01; //
    double max   = _leftMoneyPackage.remainMoney / _leftMoneyPackage.remainSize * 2;
    double money = r.nextDouble() * max;
    money = money <= min ? 0.01: money;
    money = Math.floor(money * 100) / 100;
    _leftMoneyPackage.remainSize--;
    _leftMoneyPackage.remainMoney -= money;
    return money;}


再说结论:

  1. 先抢后抢拿到红包的大小的期望是大致相等的,所以还是先下手抢吧

  2. 后抢的人方差大(依赖前面人抢的多少),波动较大,有较大几率拿到“手气最佳


祝大家抢红包快乐哦~

测试数据。
测试结果测试随机红包

以上面的初始化数据(30人抢500块),执行了两次,结果如下:

// 第一次
15.69    21.18    24.11    30.85    0.74    20.85    2.96    13.43    11.12    24.87    1.86    19.62    5.97    29.33    3.05    26.94    18.69    34.47    9.4    29.83    5.17    24.67    17.09    29.96    6.77    5.79    0.34    23.89    40.44    0.92

// 第二次
10.44    18.01    17.01    21.07    11.87    4.78    30.14    32.05    16.68    20.34    12.94    27.98    9.31    17.97    12.93    28.75    12.1    12.77    7.54    10.87    4.16    25.36    26.89    5.73    11.59    23.91    17.77    15.85    23.42    9.77

对应图表如下:


&lt;img src="https://pic4.zhimg.com/383a5c9dd7451db4d1bde8f59dcc66fb_b.png" data-rawwidth="835" data-rawheight="523" class="origin_image zh-lightbox-thumb" width="835" data-original="https://pic4.zhimg.com/383a5c9dd7451db4d1bde8f59dcc66fb_r.png"&gt;第一次写博客,好鸡冻!!《微信红包的算法实现探讨》_第1张图片

还有一张:
&lt;img src="https://pic1.zhimg.com/f3db54ba944f208ed8917651cbb7ce70_b.png" data-rawwidth="833" data-rawheight="518" class="origin_image zh-lightbox-thumb" width="833" data-original="https://pic1.zhimg.com/f3db54ba944f208ed8917651cbb7ce70_r.png"&gt;第一次写博客,好鸡冻!!《微信红包的算法实现探讨》_第2张图片
多次均值
200次
&lt;img src="https://pic2.zhimg.com/90c57b9fed9398b866e636a910e8f86d_b.png" data-rawwidth="1325" data-rawheight="751" class="origin_image zh-lightbox-thumb" width="1325" data-original="https://pic2.zhimg.com/90c57b9fed9398b866e636a910e8f86d_r.png"&gt;第一次写博客,好鸡冻!!《微信红包的算法实现探讨》_第3张图片
2000次
&lt;img src="https://pic1.zhimg.com/9c9d0c51d6528c2ac6ae599a640c271c_b.png" data-rawwidth="1328" data-rawheight="750" class="origin_image zh-lightbox-thumb" width="1328" data-original="https://pic1.zhimg.com/9c9d0c51d6528c2ac6ae599a640c271c_r.png"&gt;第一次写博客,好鸡冻!!《微信红包的算法实现探讨》_第4张图片

可以看到,这个算法可以让大家抢到的红包面额在概率上是大致均匀的。

来原于知乎:https://www.zhihu.com/question/22625187#rd


你可能感兴趣的:(第一次写博客,好鸡冻!!《微信红包的算法实现探讨》)