已知n个数的和是32898,求每一个加数,求完美版

张海霖 2015-08-24 09:57:12
原帖已经结贴。只是获得的结果并不完美,总是最大数999重复太多,显得不够随机,有点假。
http://bbs.csdn.net/topics/391814341

$r = foo(32898, 53);
echo array_sum($r), PHP_EOL; //验证总和
print_r(array_count_values($r)); //查看分布

function foo($num, $k, $min=1, $max=999) {
$res = array_fill(0, $k, 1);
do {
for($i=0; $i<$k; $i++) {
$sum = array_sum($res);
$t = rand(0, $max - $min);
if($res[$i] + $t > $max) $t = $max - $res[$i];
if($sum + $t > $num) $t = $num - $sum;
$res[$i] += $t;
}
}while($num > $sum);
return $res;
}


请修复这个问题,谢谢。
...全文
52 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2015-08-24
  • 打赏
  • 举报
回复
$t = rand(0, $max - $min); 改为 $t = rand(0, $max - $res[$i]); 这样的分布应该很好了

Array
(
    [886] => 1
    [760] => 1
    [470] => 1
    [875] => 1
    [591] => 1
    [499] => 1
    [257] => 1
    [954] => 1
    [264] => 1
    [615] => 1
    [770] => 1
    [644] => 1
    [971] => 1
    [979] => 1
    [259] => 1
    [906] => 1
    [830] => 1
    [537] => 1
    [595] => 1
    [531] => 1
    [588] => 1
    [748] => 1
    [767] => 1
    [844] => 1
    [931] => 1
    [835] => 1
    [986] => 1
    [976] => 1
    [89] => 1
    [157] => 1
    [408] => 1
    [582] => 1
    [593] => 1
    [876] => 1
    [710] => 1
    [130] => 1
    [554] => 1
    [774] => 1
    [386] => 1
    [339] => 1
    [686] => 1
    [194] => 1
    [903] => 1
    [304] => 1
    [207] => 1
    [978] => 1
    [232] => 1
    [618] => 1
    [834] => 1
    [472] => 1
    [839] => 1
    [377] => 1
    [788] => 1
)

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧