アプリ版:「スタンプのみでお礼する」機能のリリースについて

0から99までの数字をランダムに並び替えて、

 89 42 19 35 2 94 12 ....

のような数字の列を得たいのですが、どうすればよいでしょうか?一見、簡単そうなのですが、つまずいています。


最初思いついたのは次の方法です。

以下を i=0 から i=99になるまで繰り返す。

(1) tmp = (int) 100 * Math.random(); と 0~99の乱数を発生させる
(2) a[0]~a[i-1]の中にxと同じ値が無ければ a[i] = x;と代入。同じものがあったら (1)に戻る。
(3) i = i+1;

この方法だと、i=98の時は、ほとんどの場合「a[0]~a[i-1]の中にxと同じ値がある」ことになってしまい、iが増えるごとにスピードが落ちます。
100個くらいの数字なら良いのですが、100000000個の数字だと非効率な気がします。

みなさんどうなさっているのでしょうか?

A 回答 (4件)

0~99までの数列を配列に作り、それをシャッフルすればよいのでは?


まあ完全なシャッフルというのも難しいっちゃ難しいんですが。

参考URL:http://ray.sakura.ne.jp/tips/shaffle.html,http:/ …
    • good
    • 0

質問者の方法では条件分岐が処理を遅くしていると考えられます。


条件分岐を無くして次のようなアルゴリズムを採用してはどうでしょう。

n回目の処理で配列の先頭からn番目を、先頭から乱数の示すm番目の要素と入れ替える。
 1回目乱数2 12345→21345
 2回目乱数5 21345→25341
 3回目乱数3 25341→25341
 4回目乱数2 25341→24351
 5回目乱数1 24351→14352
この場合、一度スワップされた数値を再度スワップする事がありますが気にしてはいけません。
    • good
    • 0
この回答へのお礼

みなさんありがとうございます!!

シャッフルをすればいいのですね。
発想の転換でした!

お礼日時:2006/08/26 10:07

乱数を発生させるやり方でも、質問内容の方法だと


仰るとおり、スピードは遅くなるのは確実です。

0 から99までの配列をつくり、
0 から99までの乱数を2つ発生させて入れ替える。
これを適当な回数繰り返せば、ランダムな並びになります。
つまりトランプのシャッフルの要領です。

同じ乱数を使うならば、こちらの方が効率が良いかと思います。
    • good
    • 0

#1さんの意見と同じです。



java.util.Collections.shuffle(List list)

というのもあります。
これを使えば簡単かも。
    • good
    • 0

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