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

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;
}``````

...全文
54 1 打赏 收藏 转发到动态 举报

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,892

• 近7日
• 近30日
• 至今