一個演算法的小問題

來源:互聯網
上載者:User
想求一個演算法,比如我知道一個數 是 13 然後我需要隨機從 0-9 的10個數字中取 3個數 3個數的和就是 13,比如可以是 5+5+3 也可以是 3+5+5 或 5+3+5 6+2+5 可以重複 位置順序也不固定。

php 怎麼實現呢。


回複討論(解決方案)

既然有最終值的要求,就不能三個數都隨機了吧,最多隻能隨機一個數,其他的從餘值範圍的數值中在次隨機取

$num = 13;$a = array_merge(range(0, 9), range(0, 9), range(0, 9));$loop = 10;while($loop--) {  shuffle($a);  foreach(array_chunk($a, 3) as $v)    if(array_sum($v) == $num) echo join(' + ', $v), PHP_EOL;}
8 + 2 + 32 + 7 + 49 + 1 + 32 + 6 + 50 + 4 + 92 + 7 + 44 + 8 + 15 + 8 + 08 + 4 + 19 + 0 + 4

$num = 13;$a = array_merge(range(0, 9), range(0, 9), range(0, 9));$loop = 10;while($loop--) {  shuffle($a);  foreach(array_chunk($a, 3) as $v)    if(array_sum($v) == $num) echo join(' + ', $v), PHP_EOL;}
8 + 2 + 32 + 7 + 49 + 1 + 32 + 6 + 50 + 4 + 92 + 7 + 44 + 8 + 15 + 8 + 08 + 4 + 19 + 0 + 4


這個會有重複的

樓主說過: 可以重複 位置順序也不固定


$num = 13;$a = array_merge(range(0, 9), range(0, 9), range(0, 9));$loop = 10;while($loop--) {  shuffle($a);  foreach(array_chunk($a, 3) as $v)    if(array_sum($v) == $num) echo join(' + ', $v), PHP_EOL;}
8 + 2 + 32 + 7 + 49 + 1 + 32 + 6 + 50 + 4 + 92 + 7 + 44 + 8 + 15 + 8 + 08 + 4 + 19 + 0 + 4


這個會有重複的




$num = 13;$a = array_merge(range(0, 9), range(0, 9), range(0, 9));$loop = 10;while($loop--) {  shuffle($a);  foreach(array_chunk($a, 3) as $v)    if(array_sum($v) == $num) echo join(' + ', $v), PHP_EOL;}
8 + 2 + 32 + 7 + 49 + 1 + 32 + 6 + 50 + 4 + 92 + 7 + 44 + 8 + 15 + 8 + 08 + 4 + 19 + 0 + 4


這個會有重複的

樓主說過: 可以重複 位置順序也不固定



$num = 13;$a = array_merge(range(0, 9), range(0, 9), range(0, 9));$loop = 10;while($loop--) {  shuffle($a);  foreach(array_chunk($a, 3) as $v)    if(array_sum($v) == $num) echo join(' + ', $v), PHP_EOL;}
8 + 2 + 32 + 7 + 49 + 1 + 32 + 6 + 50 + 4 + 92 + 7 + 44 + 8 + 15 + 8 + 08 + 4 + 19 + 0 + 4


這個會有重複的




$num = 13;$a = array_merge(range(0, 9), range(0, 9), range(0, 9));$loop = 10;while($loop--) {  shuffle($a);  foreach(array_chunk($a, 3) as $v)    if(array_sum($v) == $num) echo join(' + ', $v), PHP_EOL;}
8 + 2 + 32 + 7 + 49 + 1 + 32 + 6 + 50 + 4 + 92 + 7 + 44 + 8 + 15 + 8 + 08 + 4 + 19 + 0 + 4


這個會有重複的



-------------------------------
如果不重複該如何寫?想了下,沒想出來

$num = 13;$a = array_merge(range(0, 9), range(0, 9), range(0, 9));$loop = 10;while($loop--) {  shuffle($a);  foreach(array_chunk($a, 3) as $v)    if(array_sum($v) == $num) echo join(' + ', $v), PHP_EOL;}
8 + 2 + 32 + 7 + 49 + 1 + 32 + 6 + 50 + 4 + 92 + 7 + 44 + 8 + 15 + 8 + 08 + 4 + 19 + 0 + 4



=====================
0){echo $a.' + '.$b.' + '.$c,PHP_EOL;}}}?>

這樣寫效率是不是很差?

其實你都沒描述清楚你的需求:
你是只需要隨機出一個結果就好呢?還是要列出所有可能?或者其它指定個結果?

只需要一個隨機的組合就行了

3個數可以重複出現

function number($num){    if( $num == 0 ) return array(0, 0, 0);    if( $num == 27 ) return array(9, 9, 9);    $data = array();        $oneMax = ( $num > 10 ) ? 9 : $num;    $oneMin = ($num > 18) ? ($num - 18) : 0;    $data[0] = rand($oneMin, $oneMax);        $twoMax = ( ($num - $data[0]) > 9 ) ? 9 : ($num - $data[0]);    $twoMin = ( ($num - $data[0]) > 9 ) ? ($num - $data[0] - 9) : 0;    $data[1] = rand($twoMin, $twoMax);        $data[2] = $num - $data[0] - $data[1];    return $data;}


自己寫了一個 求點評,不知道有沒有缺陷 或效率怎麼樣

窮舉然後再隨機抽取

只需要一個隨機的組合就行了


那簡單啊。如下:
        $sum = 13;//要求的和,不能超過27        $result = array(rand(0,9));//第一個隨機數,下面是第二個隨機數,要控制範圍,否則第三個數可能就不在範圍內        if($result[0]<$sum-9)            $result[] = rand($sum-9-$result[0],9);        else            $result[] = rand(0,$sum-$result[0]);        $result[] = $sum-array_sum($result);//和減去已經產生的兩個隨機數,就是第三個數。        var_dump($result);

echo number(13);function number($num) {  $r[] = rand(1, 9);  $r[] = rand(1, min(9, $num - $r[0]));  $r[] = $num - $r[0] - $r[1];  return join('+', $r);}
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.