php求金额的总值_php根据总金额生成指定个数的随机红包,红包算法

php根据总金额生成指定个数的随机红包,红包算法/**

* 根据总金额生成指定个数的随机红包

* 1、 微信红包, 每人最少分得1分钱

* 2、 每人分得到的金额是随机分配的

* 3、 每次生成红包就生成了对应领取红包的结果

* 生成随机红包

* Class redPacket

*/

class redPacket

{

//总金额

private $total = 0;

//红包数量

private $amount = 0;

//最小红包金额

private $min = 0.01;

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

{

$this->total = $total;

$this->amount = $amount;

$this->min = $min;

}

/**

* @return bool

*/

public function getPacket()

{

$total = $this->total;

$amount = $this->amount;

$min = $this->min;

if ($amount * $min > $total) {

return false;

}

$money = 0;

for ($i = 1; $i 

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

if ($min 

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

} else {

$money = $min;

}

$total = $total - $money;

$redPacket[] = [

'money' => $money,

'balance' => $total,

];

}

//最后一个红包,

$redPacket[] = [

'money' => $total,

'balance' => 0,

];

return $redPacket;

}

}

使用方法$total = 12.12;//红包总金额

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

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

$redPacket = new redPacket($total, $amount, $min);

$result = $redPacket->getPacket();

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

echo '第' . ($key + 1) . '个红包: ' . $val['money'] . ' 元, 余额: ' . $val['balance'] . ' 元' . "\n";

}

echo array_sum(array_column($result, 'money')); //12.12

结果第1个红包: 0.61 元, 余额: 11.51 元

第2个红包: 0.13 元, 余额: 11.38 元

第3个红包: 0.25 元, 余额: 11.13 元

第4个红包: 0.69 元, 余额: 10.44 元

第5个红包: 1.55 元, 余额: 8.89 元

第6个红包: 0.94 元, 余额: 7.95 元

第7个红包: 1.47 元, 余额: 6.48 元

第8个红包: 0.2 元, 余额: 6.28 元

第9个红包: 1.87 元, 余额: 4.41 元

第10个红包: 2.21 元, 余额: 2.2 元

第11个红包: 2.2 元, 余额: 0 元

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值