dポイントプレゼントキャンペーン実施中!

数千の配列をランダムに並べて表示させるプログラムを作りたいと思っています。プログラムは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

とこんな感じです。私の考えたアルゴリズムではランダムの数字を出力し、その配列が表示されていれば再度ランダムな数字を算出、配列が表示されていなければ表示し、配列が表示されたというフラグを付けます。
しかし、この方法だと最初はスムーズに出てくるのですが、最後にはなかなか出力されないようになります。当然といえば当然ですが。

アルゴリズムだけでも、ご存知の方ご教授いただけると幸いです。

A 回答 (3件)

1から必要なだけの数の要素を持つ配列を生成してから


シャッフルして、頭から順に出力。

shuffle
http://search.net-newbie.com/php/function.shuffl …
    • good
    • 0

配列のm番目の値とn番目の値を交換する処理を作ります。



mとnにそれぞれ配列の個数を超えないランダムな数を入れて
配列のm番目の値とn番目の値を交換する処理を最低でも配列の個数の半分だけ繰り返します。

これで配列はランダムに並びかわってしかも重複はできません。



これで納得できるようでしたら#1さんのshuffle関数はやってることは同じですからこれを使った方が楽です。
    • good
    • 0

在り来たりなアルゴリズムですが、カードに例えてみると簡単です。


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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!