首页 > 编程语言 >PHP 拼手气红包分配算法

PHP 拼手气红包分配算法

时间:2022-09-19 14:11:08浏览次数:65  
标签:红包 surplus rand keys 0.01 redpack 手气 PHP

点击查看代码
/**
     *
     * @param $money 金额
     * @param $count 数量
     * @return array
     * @throws Exception
     * @author 51924
     * @date 2022-09-19 14:06
     */
    function redAlgorithm($money, $count)
    {
        // 参数校验
        if ($count * 0.01 > $money) {
            throw new \Exception("单个红包不能低于0.01元");
        }
        // 存放随机红包
        $redpack = [];
        // 未分配的金额
        $surplus = $money;
        for ($i = 1; $i <= $count; $i++) {
            // 安全金额
            $safeMoney = $surplus - ($count - $i) * 0.01;
            // 平均金额
            $avg = $i == $count ? $safeMoney : bcdiv($safeMoney, ($count - $i), 2);
            // 随机红包
            $rand = $avg > 0.01 ? mt_rand(1, $avg * 100) / 100 : 0.01;
            // 剩余红包
            $surplus = bcsub($surplus, $rand, 2);
            $redpack[] = $rand;
        }
        // 平分剩余红包
        $avg = bcdiv($surplus, $count, 2);
        for ($n = 0; $n < count($redpack); $n++) {
            $redpack[$n] = bcadd($redpack[$n], $avg, 2);
            $surplus = bcsub($surplus, $avg, 2);
        }
        // 如果还有红包没有分配完时继续分配
        if ($surplus > 0) {
            // 随机抽取分配好的红包,将剩余金额分配进去
            $keys = array_rand($redpack, $surplus * 100);
            // array_rand 第二个参数为 1 时返回的是下标而不是数组
            $keys = is_array($keys) ? $keys : [$keys];
            foreach ($keys as $key) {
                $redpack[$key] = bcadd($redpack[$key], 0.01, 2);
                $surplus = bcsub($surplus, 0.01, 2);
            }
        }
        // 红包分配结果
        return $redpack;
    }

标签:红包,surplus,rand,keys,0.01,redpack,手气,PHP
From: https://www.cnblogs.com/xiaobo0925/p/16707510.html

相关文章

  • php计算日,周,月起止时间
    $date="2022-09-18"获取日$firstday=date('Y-m-d',strtotime("$date+0day"));$lastday=date("Y-m-d",strtotime("$date+1day"));获取周$lastday=date(......
  • PHP扩展之Yaconf
    这个是继鸟哥出品的yaf,yar之后的又一个好用的工具. Yaconf配置管理工具具体可以看鸟哥的文档: https://www.laruence.com/2015/06/12/3051.html  Yaconf的特点:......
  • 【PHP】5版本 过程式操作MySQL
     建立连接和释放连接:#连接参数$sever='localhost:3309';$username='root';$password='root';#调用连接方法,如果失败结束并打印错误信息$connection=my......
  • PHP8.1.10手动安装教程及报错解决梳理
    安装教程参考一:https://www.cnblogs.com/haw2106/p/9839655.html安装教程参考二:https://www.cnblogs.com/jiangfeilong/p/11143698.html 安装php版本8.1.10:https://www......
  • 关于phpstudy小坑
     一个很经典的问题    使用的集成环境的phpstudy, 一直都挺好的 但是每次删除后不能创建同名的数据库  最后发现原来默认的只有一个库 在这个库下面创......
  • PHP-Parser 应用之扫描发现代码中的打印、输出结构语句
    PHP-Parser是由nikic开发的一个PHP抽象语法树(AST)解析器,可方便的将代码与抽象语法树互相转换。工程上常用来生成模板代码(如rector)、生成抽象语法树进行静态分析(......
  • 在PHP中,大括号“{}”的意义与作用
    在PHP中,大括号“{}”可以起到如下作用:将多个独立语句合并为一个复合语句,例如if...else...中经常如此使用在变量间接引用中进行定界,避免歧义。例如${$my_var[8]}......
  • 同样的项目vscode 内存 93M,phpstorm 2个G
         vscodecmd+shift+p 把shellcommand添加code在环境变量中,然后可以用code.打开当前文件安装 Materialicon插件可以显示文件夹的图标......
  • thinkphp6---原生SQL查询
    最近开发项目,由于要考虑大数据的处理,对比了一下,使用Thinkphp执行SQL语句的效率,要比使用模型来做大数据的更新,效率要高很多。总结:复杂的运算,以及对大数据的查询,更新,建议使......
  • php8.0源码编译安装mysqli拓展
    将开发环境web项目上传到CentOS8.0云服务器上后,调用PHP文件报500错误,经排查php环境中不存在mysqli拓展,导致无法使用mysqli_connect()函数;查看phpinfo()页面证实猜想;原因可......