如題:
輸入:
$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;
}