红包随机

方法1

<?php

$total = 7;//红包总金额,单位:分(避免浮点引起的麻烦)
$number = 6;// 分成6个红包,支持6人随机领取
$moneyt=0.00;

for ($i = 0; $i < $number; $i++)
{
    $max = $total / ($number - $i) * 2 - 1;
    if ($max == 1){
        $money = 1;
    }else{
        $money = rand(1,$max);
    }

    if ($i == ($number - 1)) {
        $money = $total;
    } else {
        $total = $total - $money;
    }
    $moneyt = $money/100;
    echo '第'.$i.'个红包:'.$moneyt.'元,'.$total.'</br>';
}

?>

方法2

<?

/**

 * @param $total [你要发的红包总额]

 * @param int $num [发几个]

 * @return array[生成红包金额]

 */

function getRedGift($total, $num)

{

    $min = 0.01;

    $wamp = array();

    $returnData = array();

    for ($i = 1; $i < $num; ++$i) {

        $safe_total = ($total - ($num - $i) * $min) / ($num - $i); //红包金额的最大值

        if ($safe_total < 0) break;

        $money = @mt_rand($min * 100, $safe_total * 100) / 100;//随机产生一个红包金额

        $total = $total - $money;//剩余红包总额

        $wamp[$i] = round($money, 2);//保留两位有效数字

    }

    $wamp[$i] = round($total, 2);

    $returnData['MoneySum'] = $wamp;

    $returnData['newTotal'] = array_sum($wamp);

    return $returnData;

}

//测试

$data = getRedGift(100, 10);

print_r($data);

?>

方法3

 

<?php

$total=20;//红包总金额  

$num=10;// 分成10个红包,支持10人随机领取  

$min=0.01;//每个人最少能收到0.01元  

 $redpack = new redpack($total,$num,$min);

 $jieguo = $redpack->getPack();

 foreach($jieguo as $key=>$val){

     $n = $key+1;

     echo '第'.$n.'个红包:'.$val['money'].' 元,余额:'.$val['balance'].' 元<br>';  

 }

 

class redpack{

    //总金额

    private $total=0;

    //红包数量

    private $num=0;

    //最小红包金额

    private $min=0.01;

     

    public function __construct($total,$num,$min)

    {

        $this->total = $total;

        $this->num = $num;

        $this->min = $min;

    }

    //红包结果

    public function getPack()

    {

        $total = $this->total;

        $num = $this->num;

        $min = $this->min;

        for ($i=1;$i<$num;$i++)  

        {  

            $safe_total=($total-($num-$i)*$min)/($num-$i);//随机安全上限  

            $money=mt_rand($min*100,$safe_total*100)/100;  

            $total=$total-$money

            //红包数据

            $readPack[]= [

                'money'=>$money,

                'balance'=>$total,

            ];

        }

        //最后一个红包,不用随机      

        $readPack[] = [

            'money'=>$money,

            'balance'=>0,

        ];

        //返回结果

        return $readPack;

    }

     

}

?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值