方法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
;
}
}
?>