(考点: 逻辑, 循环, 随机函数应用, 任务拆分)
己知一个数字num, 将其拆分成$n个"随机"数字, 使其相加之和等于$num, 并且满足每个数字最大值不能大于$max, 最小值不能小于$min, 请完成下面函数.
例: split_num(20, 4, 8, 1) //返回 array(0 => 6, 1 => 5, 2 => 3, 3 => 6)
split_num(20, 4, 8, 1)
这里面
20是要求出来的四个数字的和
4 是四个随机数
8 是数字里的$max
1 是数字里的$min求这个函数的写法
function split_num($num, $n, $max, $min) {
}print_r(split_num(20, 4, 8, 1));
己知一个数字num, 将其拆分成$n个"随机"数字, 使其相加之和等于$num, 并且满足每个数字最大值不能大于$max, 最小值不能小于$min, 请完成下面函数.
例: split_num(20, 4, 8, 1) //返回 array(0 => 6, 1 => 5, 2 => 3, 3 => 6)
split_num(20, 4, 8, 1)
这里面
20是要求出来的四个数字的和
4 是四个随机数
8 是数字里的$max
1 是数字里的$min求这个函数的写法
function split_num($num, $n, $max, $min) {
}print_r(split_num(20, 4, 8, 1));
<?php
function split_num($sum, $num, $max, $min) {
srand(time());
$res = array(); if ($min * $num > $sum) {
return null;
} else if ($min * $num == $sum) {
for ($i = 0; $i < $num; ++ $i) {
$res[] = $min;
}
return $res;
} $left = $sum; for ($i = 0; $i != $num; ++ $i) {
$cur_max = $left - ($num - $i - 1) * $min;
$rd_num = rand($min, $cur_max);
$res[] = $rd_num;
$left -= $rd_num;
} $res[$num - 1] += $left;
return $res;
}$res = split_num(20, 4, 8, 1);
print_r($res);
?>
[[email protected] csdn]$ php split_num.php
Array
(
[0] => 11
[1] => 7
[2] => 1
[3] => 1
)
[[email protected] csdn]$ 新手纯属路过。
(
[0] => 3
[1] => 13
[2] => 1
[3] => 3
)
额,懂了,少max判断了。。
因为用户调用不当,就会出问题:(
function split_num($sum, $num, $max, $min) {
srand(time());
$res = array(); if ($min * $num > $sum) {
return null;
} else if ($min * $num == $sum) {
for ($i = 0; $i < $num; ++ $i) {
$res[] = $min;
}
return $res;
} $left = $sum; for ($i = 0; $i != $num; ++ $i) {
$cur_max = $left - ($num - $i - 1) * $min;
$cur_max = $cur_max < $max ? $cur_max : $max;
$cur_min = $left - ($num - $i - 1) * $max;
$cur_min = $cur_min < $min ? $min : $cur_min;
echo("[" . $cur_min . "," . $cur_max ."]");
$rd_num = rand($cur_min, $cur_max);
$res[] = $rd_num;
$left -= $rd_num;
} $res[$num - 1] += $left;
return $res;
}$res = split_num(20, 4, 8, 1);
print_r($res);
?>
$res = array_fill(0, $num-1, $min);
while(array_sum($res) < $sum) {
$k = rand(0, $num-1);
if($res[$k] < $max) $res[$k]++;
}
return $res;
}