min 最小金额
max 最大金额
total 剩余总金额
num 剩余总人数
if (num == 1)
{
return total
}
// 更新随机种子
srand(time(NULL));
// 确定本次随机范围
LONG low = (total – (num-1) * max) < min ? min : total – (num-1) * max;
LONG high = (total – (num-1) * max) > max ? max : (total – (num-1)*min);
LONG ave = total / num > 1 ? total / num : 1;
// 调整上限
if (high > 2 * ave) high = 2 * ave;
// 生成随机支
LONG ram = random() % high;
// 防止溢出
if (ram < low) ram = low;
if (ram > high) ram = high;
return ram;
@算法二
100元发10个红包,100元换算为分是10000,则这个随机数范围是1-9999,生成9个不重复的随机数并排序,假设为n1-n9,n0=0,n10=10000,则10个红包的钱分别是n1-n0…n10-n9,再换算为元
代码
$ cat split.php
<?php
$packs = split_money(100, 10);
var_dump($packs);
function split_money($money, $count) {
$money *= 100;
$list = array(0);
for ($i = 1; $i < $count; ++$i) {
while(in_array($r = mt_rand(1, $money), $list));
$list[] = $r;
}
sort($list);
$list[] = $money;
$packs = array();
for ($i = 0; $i < $count; ++$i)
$packs[] = ($list[$i + 1] – $list[$i]) / 100;
return $packs;
}
array(10) {
[0] =>
double(23.09)
[1] =>
double(33.62)
[2] =>
double(0.71)
[3] =>
double(19.3)
[4] =>
double(0.24)
[5] =>
double(0.47)
[6] =>
double(5.52)
[7] =>
double(2.32)
[8] =>
double(5.47)
[9] =>
double(9.26)
}