欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

3个数的和在一个范围里,求3个数

程序员文章站 2022-05-30 12:13:44
...
这3个数的取值范围是1-6,必定是整数

第一种情况,3个数的和取值范围4-10,随机产生这3个数(分3个数可以全部重复和不可以全部重复两种情况)

第二种情况,3个数的和取值范围11-17,随机产生这3个数(分3个数可以全部重复和不可以全部重复两种情况)


举例说明:
如果允许全部重复,那么如果3个数的和是15,那么3个数可能是5,5,5,而如果不允许全部重复,
3个数只可能是4,5,6或,6,6,3或3,6,6之类的组合

求一个函数,

//根据给出的和,和是否允许3个数完全相同3个数的数组,
//要求必须能否返回所有可能的组合,比如6,6,3和3,6,6都必须有可能返回。
//程序只要求随机返回所有可能性组合之一即可。
function get3nums($第几种情况,$是否允许全部重复)
//比如list($rand1,$rand2,$rand3) = get3nums(2,false);//第二种情况,且3个数字不允许全部相同
//得到$rand1=6,$rand2=6,$rand3=3

function get3nums($qingkuang,$ifxiangtong){



回复讨论(解决方案)

第一种情况
因为有三个数,可以先在传入数值的基础上减去2,然后随机出第一个数,然后计算剩余。
比如
function f($n)
{
$t = $n - 2;
$a = rand(1,min(6,$t));
$t = $n - $a - 1;
$b = rand(1,min(6,$t));
$t = $n - $a - $b;
return array($a,$b,$c);
}
如果要不能三个重复,增加判断重复的语句好了

上面有一个变量名写错了
function f($n)
{
$t = $n - 2;
$a = rand(1,min(6,$t));
$t = $n - $a - 1;
$b = rand(1,min(6,$t));
$c = $n - $a - $b;
return array($a,$b,$c);
}

第二种情况和第一种一样
不能全部重复只要在返回值前增加一个判断
if($a == $b && $b == $c)
{
return f($n);
}

/** * @$start  范围下限 * @$end    范围上限 * @$repeat 允许重复,默认不允许 **/ function get3nums($start, $end, $repeat=false) {  do {    $r = array();    $n = rand($start, $end); //取得指定范围中的一个数    $a = intval($n/3);    $r[] = rand(1, min($a, 6));    $r[] = rand(1, min($a, 6));    $r[] = $n - array_sum($r);    if($repeat) break;  }while(count(array_count_values($r)) == 1);  return $r;}print_r(get3nums(4, 10));print_r(get3nums(4, 10, 1));print_r(get3nums(11, 17));print_r(get3nums(11, 17, 1));

/** * @$start  范围下限 * @$end    范围上限 * @$repeat 允许重复,默认不允许 **/ function get3nums($start, $end, $repeat=false) {  do {    $r = array();    $n = rand($start, $end); //取得指定范围中的一个数    $a = intval($n/3);    $r[] = rand(1, min($a, 6));    $r[] = rand(1, min($a, 6));    $r[] = $n - array_sum($r);    if($repeat) break;  }while(count(array_count_values($r)) == 1);  return $r;}print_r(get3nums(4, 10));print_r(get3nums(4, 10, 1));print_r(get3nums(11, 17));print_r(get3nums(11, 17, 1));



不对啊,我的数字1-6之间,你这个好多都超过6了

Array
(
[0] => 2
[1] => 2
[2] => 4
)
Array
(
[0] => 1
[1] => 1
[2] => 2
)
Array
(
[0] => 4
[1] => 1
[2] => 8
)
Array
(
[0] => 2
[1] => 1
[2] => 8
)

不对啊,我的数字1-6之间,你这个好多都超过6了


你到底有没有看懂?


不对啊,我的数字1-6之间,你这个好多都超过6了


你到底有没有看懂?

3个数的取值都必须在1-6之间。输出的居然有8

/**
* @$start 范围下限
* @$end 范围上限
* @$repeat 允许重复,默认不允许
**/
function get3nums($start, $end, $repeat=false) {
if(!$repeat){
$n =rand($start, $end); //取得指定范围中的一个数
for($i=1;$i for($j=1;$j $k=$n-$i-$j;
if($k0){
if(($i==$j and $j==$k)){
continue;
}
echo $i.'-'.$j.'-'.$k."
";
}
}
}
}else{
$n =rand($start, $end);
$avg=$n/3;
if( $avg!=intval($avg)){
echo "no value"."
";
}else{
echo $avg.'-'.$avg.'-'.$avg."
";
}
}
}

print_r(get3nums(4, 10));
echo '
';
print_r(get3nums(4, 10, 1));
echo '
';
print_r(get3nums(11, 17));
echo '
';
print_r(get3nums(11, 17, 1));
?>

再检查一下就是了

function get3nums($start, $end, $repeat=false) {  do {    do {      $r = array();      $n = rand($start, $end); //取得指定范围中的一个数      $a = intval($n/3);      $r[] = rand(1, min($a, 6));      $r[] = rand(1, min($a, 6));      $r[] = $n - array_sum($r);    }while(max($r) > 6);    if($repeat) break;  }while(count(array_count_values($r)) == 1);  return $r;}

/**
* @$start 范围下限
* @$end 范围上限
* @$repeat 允许重复,默认不允许
**/
function get3nums($start, $end, $repeat=false) {
if(!$repeat){
$n =rand($start, $end); //取得指定范围中的一个数
for($i=1;$i for($j=1;$j $k=$n-$i-$j;
if($k0){
if(($i==$j and $j==$k)){
continue;
}
echo $i.'-'.$j.'-'.$k."
";
}
}
}
}else{
$n =rand($start, $end);
$avg=$n/3;
if( $avg!=intval($avg)){
echo "no value"."
";
}else{
echo $avg.'-'.$avg.'-'.$avg."
";
}
}
}

print_r(get3nums(4, 10));
echo '
';
print_r(get3nums(4, 10, 1));
echo '
';
print_r(get3nums(11, 17));
echo '
';
print_r(get3nums(11, 17, 1));
?>



错误还是比较多的。而且11,17这种铁定出现6,不理想。

推荐阅读