• ベストアンサー

数千の配列をランダムに並べて表示

数千の配列をランダムに並べて表示させるプログラムを作りたいと思っています。プログラムはPHPを考えています。 例えば配列数を1000だとすると $file_name[0] = "files0"; $file_name[1] = "files1"; $file_name[2] = "files2"; $file_name[3] = "files3"; $file_name[4] = "files4"; ・・・ $file_name[999] = "files999"; だとします。この配列からランダムに重複無く表示したいと思っています。出力例として、 files3 files328 files1 files32 ・・・ files473 とこんな感じです。私の考えたアルゴリズムではランダムの数字を出力し、その配列が表示されていれば再度ランダムな数字を算出、配列が表示されていなければ表示し、配列が表示されたというフラグを付けます。 しかし、この方法だと最初はスムーズに出てくるのですが、最後にはなかなか出力されないようになります。当然といえば当然ですが。 アルゴリズムだけでも、ご存知の方ご教授いただけると幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

1から必要なだけの数の要素を持つ配列を生成してから シャッフルして、頭から順に出力。 shuffle http://search.net-newbie.com/php/function.shuffle.html

その他の回答 (2)

回答No.3

配列のm番目の値とn番目の値を交換する処理を作ります。 mとnにそれぞれ配列の個数を超えないランダムな数を入れて 配列のm番目の値とn番目の値を交換する処理を最低でも配列の個数の半分だけ繰り返します。 これで配列はランダムに並びかわってしかも重複はできません。 これで納得できるようでしたら#1さんのshuffle関数はやってることは同じですからこれを使った方が楽です。

  • yukigle
  • ベストアンサー率14% (9/63)
回答No.2

在り来たりなアルゴリズムですが、カードに例えてみると簡単です。 昇順でもいいですから、n枚カードを並べます。 1~n枚目のうち、ランダムでr枚目を引きぬきますが、ここで隙間をなくしたい。でも、詰める必要はありません。空いた所に、n枚目のカードを移せばいいだけなのです。n枚目は空となり、これで1枚減ってn-1枚になりました。r枚目のカードはもうないので、重複することはありません。もう一度ランダムでr枚目なら、前のn枚目のカードだったわけです。 これを、なくなるまで繰り返せば完了です。  

関連するQ&A