美文网首页
PHP随机红包算法(含最小值)

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

作者: Vencenty | 来源:发表于2019-02-25 20:02 被阅读0次
function demo($total, $num, $min = 0.01)
{
    $overPlus = $total - $num * $min; // 剩余待发钱数
    $base = 0; // 总基数
    // 存放所有人数据
    $container = array();
    // 每个人保底
    for ($i = 0; $i < $num; $i++) {
        // 计算比重
        $weight = round(lcg_value() * 1000);
        $container[$i]['weight'] = $weight; // 权重
        $container[$i]['money'] = $min; // 最小值都塞进去
        $base += $weight; // 总基数
    }

    $len = $num - 1; // 下面要计算总人数-1的数据,
    for ($i = 0; $i < $len; $i++) {
        $money = floor($container[$i]['weight'] / $base * $overPlus * 100) / 100; // 向下取整,否则会超出
        $container[$i]['money'] += $money;
    }

    // 弹出最后一个元素
    array_pop($container);
    $result = array_column($container, 'money');
    $last_one = round($total - array_sum($result), 2);
    array_push($result, $last_one);
    return $result;
}

首先要保底,每个人要拿到一个最低的钱,那么要均分的钱=总钱数-人数*最低金额,lcg_value()这个函数取 0-1的随机数,这里我为了乘了一千则是获取了 0 - 1000的随机数,每个人都分配一个随机数,然后把所有人的随机数全部相加, 每个人的随机数 / 随机数总和,那么就得到了每个人所应分得的钱的比例

这里要注意一点:

  • 最后一个人的钱要用总钱数-之前所有人均分的总金额,否则会有误差
  • 这里用了round()函数是因为php浮点精度问题,不用round(),最后一个人计算的金额会出现 13.230000004638 类似这种情况
  • foo(999999,15000, 12)这个函数在计算比较多的数据的情况,可能偶尔会出现999998.99999999 的这种情况,暂时不清楚如何解决

相关文章

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

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

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

  • PHP随机红包算法

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

  • 红包随机算法Java实现

    需求:红包总金额随机后每份金额:最大值200, 最小值0.01;最大份数100;工具:idea参考:微信红包算法以...

  • PHP随机红包

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

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

  • 抢红包算法@随机算法

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

  • PHP红包算法

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

  • 随机红包分配算法

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

  • 微信红包随机算法初探

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

网友评论

      本文标题:PHP随机红包算法(含最小值)

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