技术饭
php随机生成5到25范围内的数字,组成数组并且数组总和等于100
php随机生成5到25范围内的数字,组成数组并且数组总和等于100,生成一个总和是100的数组并不难,只要随机N-1次,然后最后一个数字是100扣除已生成得总和,补足100即可,但难点在于这些数字需要控制在5到25之间,所以只能采用每次赋值计算最大值最小值的方法,然后不随机生成数字,总数扣减,最大值最小值逼近相同。
<?php
/**
* 打印输出方法
* @param $data
* @return void
*/
function p($data = []): void
{
if (is_array($data) || is_object($data)) {
echo "<pre>";
print_r($data);
echo "</pre>\n";
} else {
echo $data, PHP_EOL;
}
}
/**
* 获取范围内的随机数量数组,并且总和等于某个值
* @param $total 总数
* @param $num 限制生成数量
* @param $limitMin 限制最小值
* @param $limitMax 限制最最大值
* @return array
*/
function getRandNumArr($total = 100, $count = 4, $limitMin = 1, $limitMax = 100):array
{
//处理数据
$number = [];
for ($i = 1; $i <= $count; $i++){
//最小值
$min = $total - ($count - $i) * $limitMax;
$min = $min <= $limitMin ? $limitMin : $min; // 判断最小值
//最大值
$max = $total - ($count - $i) * $limitMin;
$max = $max >= $limitMax ? $limitMax : $max; // 判断最大值
$max = $min > $max ? $min : $max; // 最大值如果小于等于最小值则最大值等于最小值,防止mt_rand报错
//随机数
$randNum = mt_rand($min, $max);
$total -= $randNum;
$number[] = $randNum;
}
//随机打乱
shuffle($number);
return $number;
}
//调用函数
$number = getRandNumArr(100, 6, 5, 25);
p($number);
p(array_sum($number));
参考:
How to make 5 random numbers with sum of 100 [duplicate]
文明上网理性发言!