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

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 的这种情况,暂时不清楚如何解决
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值