<?php /** * @param $count 隨機數個數 * @param $sum 隨機數總和 * @param $mix 最小隨機數 * @param $max 最大隨機數 * */ function getRand($count,$sum,$mix,$max){ ini_set('memory_limit', "1024M"); $i=1; while ($i <= $count) { $tmp[] = mt_rand($mix,$max); $i++; } $k = $sum / array_sum($tmp); $res = []; foreach ($tmp as $v) { $res[] = (int) ($v*$k); } $assoc = $sum - array_sum($res); $last = array_pop($res); $res[] = $last + $assoc; while (max($res) > $max) { $tmax = max($res); $key = array_search($tmax, $res); if($key !== false){ $res[$key] = mt_rand($mix,$max); $k = array_search( min($res), $res); $res[$k] = $tmax - $res[$key] + min($res); } } return $res; } $res = getRand(300,400000,300,2000); var_dump(count($res)); var_dump($res[1]); var_dump(array_sum($res));