PHP最简单的随机红包算法

作者: 小牛_6666 | 来源:发表于2019-05-21 11:04 被阅读3次

需求:

5000元,随机分给10000人,要求每个人最少0.01,最大50;

分析:

5000元分给10000人,平均每人0.5,如果随机0.01-50,那么平均值就在25左右,这就有问题了
分化为两种结果:
1,在保证剩余人至少能分到0.01的情况下,按照0.01-50进行随机分配,这种会每个金额都有,但是绝大部分会只有0.01,结果统计如下:

范围 概率
0.01 98.02%
(0.01,5] 0.209%
(5-10] 0.182%
(10-15] 0.212%
(15-20] 0.210%
(20-25] 0.187%
(25-30] 0.207%
(30-35] 0.194%
(35-40] 0.203%
(40-45] 0.183%
(55-50] 0.193%

代码如下:

$total=50000;
$num=100000;
$max=50;
$min=0.01;
$rs=red_packet($total,$num,$max,$min);
shuffle($rs);
function red_packet($total,$num,$max,$min){
    $re=[];
    while ($num>0){
        $num--;
        $tmp_max=min($max,round($total-$num*$min,2));//保证剩下红包金额不小于范围中的最小值
       $tmp_min=max($min,round($total-$num*$max,2));//保证剩下红包金额不大于范围中的最大值
        $money=mt_rand($tmp_min*100,$tmp_max*100)/100;
        $total-=$money;
        $re[]=$money;
    }
    return $re;
}

这个函数返回的数组最好使用shuffle函数打散后再使用


2,使平均值始终保持在0.5左右,这样数据会比较平稳,金额都相差不大,获得大金额的概率非常低,统计结果如下:

范围 概率
0.01 1.11%
(0.01,0.2] 19.54%
(0.2-0.4] 19.98%
(0.4-0.6] 20.10%
(0.6-0.8] 19.75%
(0.8-1] 19.45%
(1,1.2] 0.07%
(1.2-50] 0%

代码如下:

$total=5000;
$num=10000;
$max=50;
$min=0.01;
$rs=red_packet($total,$num,$max,$min);
function red_packet($total,$num,$max,$min){
    $re=[];
    while ($num>0){
        $vag=round($total/$num,2);
        $num--;
        $tmp_max=min($max,round($total-$num*$min,2));//保证剩下红包金额不小于范围中的最小值
        $tmp_min=max($min,round($total-$num*$max,2));//保证剩下红包金额不大于范围中的最大值
        $vag_diff=min($tmp_max-$vag,$vag-$tmp_min);//这是波动幅度
        $end_max=$vag+$vag_diff;
        $end_min=$vag-$vag_diff;
        $money=mt_rand($end_min*100,$end_max*100)/100;
        $total-=$money;
        $re[]=$money;
    }
    return $re;
}

以上两种都不符合正态分布,第一种是大部分0.01,小部分在0.01-50之间均匀分布,第二种是大部分在0.01-1之间均匀分布,感觉要想正态分布,首要条件就是范围的中间值正好等于总的平均值,但结果也只会是均匀分布,就是获得每个金额的频率是相等的,想像不出正态分布应该是什么样的结果。

相关文章

  • PHP最简单的随机红包算法

    需求: 5000元,随机分给10000人,要求每个人最少0.01,最大50; 分析: 5000元分给10000人,...

  • 2018-12-21php红包分发算法

  • PHP随机红包算法

    随机红包算法就是给定一个具体的红包金额,具体的红包个数,还有给定红包的最大金额和最小金额,按照业务可以分成两种,一...

  • PHP随机红包

  • 微信红包算法 - OC

    知乎-微信红包算法 一个简单的分配算法:随机分配n次把每次分配的部分减去,在进行随机分配分配过程中,考虑好,分配为...

  • PHP随机红包算法(含最小值)

    首先要保底,每个人要拿到一个最低的钱,那么要均分的钱=总钱数-人数*最低金额,lcg_value()这个函数取 0...

  • 抢红包算法@随机算法

    生成随机数 注:randomElement() 如果 range 是空,返回 nil 数组随机 洗牌算法 Swif...

  • PHP红包算法

    代码 输出1 array(6) {[0]=>float(5544)[1]=>float(1805)[2]=>flo...

  • 微信红包随机算法初探

    本文简书备份地址:微信红包随机算法初探 最近看了一篇文章,讲微信红包随机算法的。感觉很不错,所以自己实现了下,并进...

  • 随机红包分配算法

    红包随机分配的入参,一般只有两个,总金额与抢红包的总人数。难点是要保证在最后一个人抢完之前,不能让剩余钱包为空。所...

网友评论

    本文标题:PHP最简单的随机红包算法

    本文链接:https://www.haomeiwen.com/subject/suldzqtx.html