• 締切済み

$arrN[0] = $arrN[1] = $arrN[2] = $arrN[3] = $arrN[4] = array("2","3"...."w");で。

PHPというより、 数学的アルゴリズムの問題かもしれませんが・・・ $arrN[0] = $arrN[1] = $arrN[2] = $arrN[3] = $arrN[4] = array("2","3","4,"5","7","8","9", "a","f","h", "w"); がありまして。 「$arrN[0]からランダムに選んだ要素」.「$arrN[1]から…」.「$arrN[2]から…」.「$arrN[3]から…」.「$arrN[4]から…」.「$arrN[5]から…」 なる文字列を配列$arrPにどんどん入れていきたいです。 で、 $arrP のどの要素も重複を許可しないものとしたいです。 すると、$arrPの要素の個数は、($arrN[0]の要素の個数) ^ 5 = 161051となるわけです。 ですが、毎回(161051回)、5回ランダムに選んで、それが、すでに選んだ「$arrPの要素のどれか」と一致する場合は、再度繰り返す・・・ということをやっていると、 とてつもなく時間がかかってしまいます。 なんとかして、短時間で、これを実現する方法はないでしょうか? なお、 この問題をもっと簡単にすると、 「0,1,2,3,.....9998,9999」なる整数の集まりに対して、これを、 ランダムに短時間で順番をシャッフルする・・・というようなことができれば、 希望のこともできそうなのですが。。。(たぶん・・・) いいアイディアないでしょうか? よろしくお願いします。

みんなの回答

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.5

すみません。不注意でした。 array_push($arrP, $arrX[$i] . $arrX[$j] . $arrX[$k] . $arrX[$l] . $arrX[$m]); です。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

なんかあさってな回答ですみません。 #3の件は array_push($arrP, $arrX[i] . $arrX[j] . $arrX[k] . $arrX[l] . $arrX[m]); ではなく array_push($arrP, $arrX[$i] . $arrX[$j] . $arrX[$k] . $arrX[$l] . $arrX[$m]); ではないでしょうか?

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.3

$arrP=array; $arrX=array("2","3","4","5","7","8","9","a","f","h", "w"); for($i=0;i<10;$i++){ for($j=0;i<10;$j++){ for($k=0;i<10;$k++){ for($l=0;i<10;$l++){ for($m=0;i<10;$m++){ array_push($arrP, $arrX[i] . $arrX[j] . $arrX[k] . $arrX[l] . $arrX[m]); }}}}} shuffle($arrP); echo $arrP[0]; の意味ですか?12^5個要素が出来ると思うのですが...

ymck
質問者

お礼

そうです。ありがとうございます。 12^5個でなく11^5なのですが、それは本質的でないのでいいとして、 いただいたコードで、 //===== $arrP=array; ⇒ $arrP=array(); i<10; 5つ ⇒ $i<11; $j<11; $k<11; $l<11; $m<11; //====== となおし、以下のようなコードを書きました。 <?php error_reporting(0); $arrP=array(); $arrX=array("2","3","4","5","7","8","9","a","f","h", "w"); for($i=0;$i<11;$i++){ for($j=0;$j<11;$j++){ for($k=0;$k<11;$k++){ for($l=0;$l<11;$l++){ for($m=0;$m<11;$m++){ array_push($arrP, $arrX[i] . $arrX[j] . $arrX[k] . $arrX[l] . $arrX[m]); }}}} } shuffle($arrP); echo 'the number of items in array $arrP is'; echo "\n"; echo count($arrP); echo "\n--------\n\n\n\n"; sleep(5); //★=== $begin_date = date('h:i:s'); $seq = 0; foreach ($arrP as $str){ $seq++; printf("%08d", $seq); print "....."; print $str; print "\n"; } $end_date = date('h:i:s'); print "begin:" . $begin_date . "\n"; print "end:" . $end_date . "\n"; //★=== ?> すると、 [webmaster@www dev.example.com]$ php tmp.php the number of items in array $arrP is 161051 ------------------------------- となり、 161051 つまり、11^5 の要素が得られたので、できました。 /** 今ふと思ったのですが、自分、一番最初の質問の最後に、 //=== この問題をもっと簡単にすると、 「0,1,2,3,.....9998,9999」なる整数の集まりに対して、これを、 ランダムに短時間で順番をシャッフルする・・・というようなことができれば、 希望のこともできそうなのですが。 //=== って書いてましたね・・・。 shuffle なるそのまんまの関数が存在することをしらなかったので、遠回りしてしまいましたが */ ただ,,,まだ問題がありまして・・・・・・・ 字数が足りないので、以下、補足にまわします。

ymck
質問者

補足

続きです・・・・・・・・・・・。 そのあと、 //★=== から //★===までが、 00000001..... 00000002..... 00000003..... 00000004..... (中略) 00161049..... 00161050..... 00161051..... begin:01:03:55 end:01:04:20 [webmaster@www dev.example.com]$ となって、実際にほしい、「25f3w」とか「ha75a」とかの文字列が、 「.....」の右に表示されないんですよね・・・。 なぜなんでしょうか? きっとケアレスミスに違いないとおもいいろいろいじったのですが、ワカリマセンでした。 お助け願えませんでしょうか? よろしくお願いします。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

つまり、arrNの各要素は値が必ずしも同値でないということですね であればarray_diffをしてみてはどうでしょうか? あとは前回とフローはたいして変わりません。 <? $arrN[0] = $arrN[1] = $arrN[2] = $arrN[3] = $arrN[4] =array("2","3","4","5","7","8","9","a","f","h","w"); for($i=0;$i<5;$i++){ $array=$arrN[$i]; $array=array_diff($array, (array) $arrP); shuffle($array); $arrP[]= array_shift($array); } print_r($arrP); ?>

ymck
質問者

お礼

たびたび恐縮です。 >arrNの各要素は値が必ずしも同値でないということですね いえ、すみません。そうではないです。 もっと単純化すると、 $arrN[0] = $arrN[1] = $arrN[2] = $arrN[3] = $arrN[4] =array("2","3","5"); において、 「$arrN[0]の要素のどれか」.「$arrN[1]の要素のどれか」.「$arrN[2]の要素のどれか」.「$arrN[3]の要素のどれか」.「$arrN[4]の要素のどれか」 の形式である文字列からなる配列$arrPを求めたい、ただし、その配列からどの2つの要素をとっても、一致しない。 ということです。 この場合だと、$arrP の要素数は3^5=243個です。 具体的には、(整数にキャストして小さい数から書くとすると) 22222 22223 22225 22232 22233 22235 22252 22253 22255 (中略) 32335 32352 32353 32355 32522 32523 32525 32532 32533 32535 32552 32555 33222 33223 (中略) 55522 55523 55525 55532 55533 55535 55552 55553 55555 です。 紛らわしくで恐縮です。 ありがとうございます。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

同じ値を持たせるのになぜ多次元をつかっているのかわかりませんが array("2","3","4,"5","7","8","9", "a","f","h", "w") から5個とりだすのであれば、shuffleしながら先頭からとっていけばいい気がしますが・・・ <? $arrX=array("2","3","4","5","7","8","9","a","f","h", "w"); for($i=0;$i<5;$i++){ shuffle($arrX); $arrP[]= array_shift($arrX); } print_r($arrP); ?>

ymck
質問者

お礼

ご回答ありがとうございます。 すみません前後関係を省いてしまったせいでわかりづらかったですね。 >同じ値を持たせるのになぜ多次元をつかっているのかわかりませんが わかりやすいように、そうしました。 誤解を与えてしまったようですが、要は、12進法の5桁の文字列を、配列$arrPにぶちこんでいき、結果、 ======================== 12^5個の要素を持つ配列$arrPを求めたい($arrPは、いずれの要素も一致しない) ======================== なので、いただいた回答と求めているものが違いまして・・・ 説明不足ですみません。 もしおわかりでしたら、よろしくお願いします。

関連するQ&A