ホームページ > バックエンド開発 > PHPチュートリアル > アルゴリズムに関する小さな問題

アルゴリズムに関する小さな問題

WBOY
リリース: 2016-06-20 12:39:06
オリジナル
924 人が閲覧しました

たとえば、数値が 13 であることがわかっています。次に、0 ~ 9 の 10 個の数値からランダムに 3 つの数値を選択する必要があります。たとえば、次のようになります。 5+5+3 または 3+5+5 または 5+3+5 のいずれかになります。 6+2+5 は繰り返すことができ、ポジションの順序は固定されません。

PHP での実装方法。


ディスカッション(解決策)への返信

そこから最終的な値の要件は、3 つの数値すべてをランダムにすることはできないということです。ランダムにできるのは最大でも 1 つの数値だけであり、残りの数値は残りの値の範囲

$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
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー


============== ===== ==

<?php	$sum = 13;	for($a=0; $a<10; $a++){		for($b=0; $b<10; $b++){			$c = $sum-$a-$b;			if($c<10 && $c>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);}
ログイン後にコピー

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート