如题:
输入:
$num 要产生的数值数量 (正整数) 预设为2个
$precision 决定小数下几位 (正整数) 预设精度为小数下6位
输出:
$weightarray $num个元素,总和为1的阵列 (实数阵列)
function weight_array($num = 2, $precision = 6){ $min = 0; $max = pow(10, $precision); $weightarray = []; $sum_temp = 0; //若只有一个元素,权重为1 if($num == 1){ $weightmatrix[0] = 1; }else{ for($i=0;$i<($num-1);$i++){ array_push($weightarray, rand(0, $max)); $max = $max-$weightarray[$i]; $sum_temp += $weightarray[$i]; } //保证产出的阵列,数值总和必为1 if(($num-1)>0){ $last = pow(10, $precision) - $sum_temp; array_push($weightarray, rand($last, $last)); } //将阵列内的整数数值转成小数点后6位 $sum_temp = 0; for($i=0;$i<($num);$i++){ $weightarray[$i] /= pow(10, $precision); $sum_temp += $weightarray[$i]; } } //避免产出的权重第一个都很重,因此加入一个洗牌的过程 shuffle($weightarray); return $weightarray;}