随机生成红包金额算法
博客专区 > Gavaen 的博客 > 博客详情
随机生成红包金额算法
Gavaen 发表于1年前
随机生成红包金额算法
  • 发表于 1年前
  • 阅读 28
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

    /**
     * 随机生成红包金额
     * @param $n 红包个数
     * @param $sum  总金额 整数
     * @param $index_max  最大金额在数组中索引
     * @param $error
     * @return array|false
     */
    public static function GenRandRePacketsData($n,$sum,&$index_max,&$error)
    {
        //$n = 20;
        //$sum = 300;
        if($sum < $n)
        {
            $error = '金额总数不能小于红包个数'; //$error = '金额总数必须大于红包个数';
            return false;
        }
        if($n > 50)
        {
            $error = '红包数量不能大于50';
            return false;
        }
        //$sum = $sum * 100;//转为分
        $rst = [];
        $ave = intval($sum/$n);  // 金额除去红包个数 平均值 test:3/3 = 1
        $one_rst = rand(1,$ave); // 随机取1到平均值的数
        $subSum = $one_rst;  // 1
        //$rst[] = $one_rst/100;
        $rst[] = $one_rst; // $rst = ['0'=>1];
        $index_min = 0;
        $index_max = 0;
        $min = $one_rst; // 1
        $max = $one_rst; // 1

        for($i = 2; $i <= $n; $i ++)
        {                   
            $ave = intval(($sum - $subSum)/($n - $i + 1)); // 1
            $one_rst = rand(1,$ave); // 1
            if($min > $one_rst) // 1 > 1
            {
                $min = $one_rst;
                $index_min = $i -1;
            }
            if($max < $one_rst) // 1 < 1
            {
                $max = $one_rst;
                $index_max = $i -1;
            }
            //$rst[] = $one_rst/100;
            $rst[] = $one_rst;
            $subSum += $one_rst; // 1
        }
        $left = $sum - $subSum;

        if($left > 0)
        {
            //$rst[$index_min] = ($rst[$index_min] + $left/100);
            $rst[$index_min] = ($rst[$index_min] + $left);
            if($rst[$index_min] > $max)
            {
                $max = $rst[$index_min];
                $index_max = $index_min;
            }
        }
        //检测重复的最大值处理,确保最大值唯一
        /*for($i =0; $i < $n; $i++)
        {
            if($rst[$i] === $max && $i !== $index_max)
            {
                $one_rst = $rst[$i] -1;
                $rst[$i] = $one_rst;
                $rst[$index_max] = $max + 1;
                break;
            }
        }*/

        //重新乱序
        shuffle($rst);
        //查找最大值
        $index_max = 0;
        $max = $rst[0];
        for($i =1; $i < $n; $i ++)
        {
            if($rst[$i]> $max)
            {
                $index_max = $i;
                $max = $rst[$i];
            }
        }
        return $rst;
    }

 

标签: PHP 红包 算法
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 0
博文 4
码字总数 1499
×
Gavaen
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: