12 11 2022
摘要:设计一个随机分配红包方案,要求给定金额和人数后,给每个人随机生成一个红包金额,每个人最少1分,并且当前人数正好将给定的金额分完
// 设计一个随机分配红包方案,要求给定金额和人数后,给每个人随机生成一个红包金额

// 每个人最少1分,并且当前人数正好将给定的金额分完

//----------------------------------------------------------------------------

// 方法一

$cash = 10; // 金额(分)

$num = 5; // 人数

/**

* 金额分配

* 返回各个随机金额的数组,或在失败时返回false

* @param $cash int 金额(分)

* @param $num int 人数

* @return array|false

*/

function distributeCash($cash, $num) {

if ($num < 1 || $cash < $num) {

return false;

}

$data = [];

for($i = $num; $i > 0; $i--) {

if ($i > 1) {

$money = $cash / $i * 2 - 1;

$data[$i] = rand(1, $money);

$cash -= $data[$i];

} else {

$data[$i] = $cash;

}

}

return $data;

}

$list = distributeCash($cash, $num);

if (!$list) {

echo "参数错误<br>\n";

exit;

}

foreach ($list as $item) {

printf("%s<br>\n", $item);

}

//----------------------------------------------------------------------------

// 方法二

$cash = 10; // 金额(分)

$num = 10; // 人数

/**

* 金额分配

* 返回各个随机金额的数组,或在失败时返回false

* @param $cash int 金额(分)

* @param $num int 人数

* @return array|false

*/

function distributeCashV2($cash, $num) {

if ($num < 1 || $cash < $num) {

return false;

}

$count = ceil($num / 2);

$avg = floor($cash / $count);

$data = [];

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

$rand = mt_rand(1, $avg - 1);

$data[] = $rand;

$cash -= $rand;

if ($i * 2 <= $num) {

$rand2 = $avg - $rand;

$data[] = $rand2;

$cash -= $rand2;

}

}

rsort($data);

$data[0] += $cash;

shuffle($data);

return $data;

}

$list = distributeCashV2($cash, $num);

if (!$list) {

echo "参数错误<br>\n";

exit;

}

foreach ($list as $item) {

printf("%s<br>\n", $item);

}


延伸阅读
  1. 上一篇:
  2. 下一篇:
发表评论