已知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;
}


请修复这个问题,谢谢。
...全文
48 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
)

1、加、减的意义和各部分间的关系 (1)把两个数合并成一个数的运算,叫做加法。 (2)相加的两个数叫做加数。加得的数叫做和。 (3)已个数的积与其中的一个加数另一个加数的运算,叫做减法。 (4)在减法中,已的和叫做被就减数……。减法是加法的逆运算。 (5)加法各部分间的关系: 和=加数加数   加数=和-另一个加数 (6)减法各部分间的关系: 差=被减数-减数 减数=被减数-差 被减数=减数+差 2、乘、除法的意义和各部分间的关系 (1)几个相同加数的和和的简便运算,叫做乘法。 (2)相乘的两个数叫做因数。乘得的数叫做积。 (3)已两个因数的积与其中一个因数,另一个因数的运算,叫做除法。 (4)在除法中,已的积叫做被除数…… 。除法是乘法的逆运算。 (5)乘法各部分间的关系: 积=因数×因数   因数=积÷另一个因数 (6)除法各部分间的关系: 商=被除数÷除数 除数=被除数×商 被除数=商×除数 (7)有余数的除法, 被除数=商×除数+余数 加法、减法、乘法、除法统称为四则运算 3、四则混和运算的顺序 (1)在没有括号的算式里,如果只有加、减法,或者只有乘、除法,都要按(从左往右)的顺序计算; (2)在没有括号的算式里,如果既有乘、除法,又有加、减法,要先算(乘、除法),后算(加、减法);(先乘除,后加减) (3)在有括号的算式里,要先算括号里面的,后算括号外面的。

21,873

社区成员

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

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