- 代码
<?php
/**
* 发红包
* @param int $sum 要发放的总金额
* @param int $number 要发放的人数
* @return array 返回的数组是每个人对应的金额
*/
function devide_money($sum = 50, $number = 10)
{
$arr = [];
for ($i = 1; $i <= $number; $i++) {
$arr[] = rand(10, 100);
}
$sum_money = array_sum($arr);
echo '10-100之间随机数的总金额' . $sum_money;
array_walk($arr, function (&$item) use ($sum, $sum_money) {
$item = $sum / $sum_money * $item;
$item = sprintf('%.2f', $item);
});
// 这时候的 array_sum($arr) 应该是一个接近50的值,因为有除法,我们取的是两位的小数
// 与50比较,多或者少,都给最后一个用户
$result_sum = array_sum($arr);
echo '<br> 红包发放到每个人的原始总值' . $result_sum;
if ($result_sum !== $sum) {
$diff = $sum- $result_sum; // 如果是正数,表述有多余的,负数,表示值多算了
// 获取最后一个值,并更改
end($arr); // 注意 end key 函数必须单独写,而不能放在一块
$last_key = key($arr);
$last_value = $arr[$last_key];
$arr[$last_key] = $last_value + $diff;
}
echo '<br> 更新最后一个人的红包金额后的总值' . array_sum($arr);
return $arr;
}
$res = devide_money();
echo '<pre>';
print_r($res);

- 设计思路
- 保证每个红包都是公平的随机值,rand(10, 100);
- 红包生成后会有一个总金额 sum_money,这个金额肯定和我们输入的金额 sum 不对等
- 解决每个红包金额比例对等问题 sum/sum_money*$item
- 这时候的总金额与输入的红包金额值是接近的,要解决差额的问题,处理到最后一个红包
领取红包
领取红包可以直接 array_pop($arr) 这种方式领取,不过如果你想重新打乱红包的顺序,建议有两种方式
- 1.将生成的红包 shuffle ( array &$array ) : bool
-
array_rand ( array
$array
[, int$num
= 1 ] ) : [mixed] array_rand — 从数组中随机取出一个或多个单元
-
array_rand ( array
注意 array_rand 取出来的是键
<?php
$input = array("Neo", "Morpheus", "Trinity", "Cypher", "Tank");
$rand_keys = array_rand($input, 2);
echo $input[$rand_keys[0]] . "\n";
echo $input[$rand_keys[1]] . "\n";
?>
网友评论