- ベストアンサー
配列と乱数でおかしな結果が出てしまう件
- 配列には同じ数は入らないはずなのに、おかしな結果が出てしまう問題が発生しています。
- デバッグしても原因がわからず、同じ数が配列に入ってくる現象に困っています。
- 乱数生成の方法や配列の処理を見直しても解決しないため、どこがおかしいのか教えていただきたいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> どこがおかしいのでしょうか・・・。 仕様を誤解しています。 > このロジックで配列には同じ数は入らないだろうと思ったんですが んなこたありません。 あくまでも(名目上は)等確率で乱数を生成しているだけなので、 一度出た数字が二度は出ないなどということは 保証されていません。 Random (Java 2 Platform SE 5.0) http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/Random.html nextInt() 乱数ジェネレータのシーケンスを使って、一様分布の int 型の擬似乱数を返します。 たとえば1~10の範囲でどれもが一度ずつ登場する ランダムな数列が欲しいのなら、 配列をシャッフルするなどしてください。 Javaアルゴリズム http://homepage3.nifty.com/teranet/JavaAlgorithm/Shuffle.html
その他の回答 (3)
- sakusaker7
- ベストアンサー率62% (800/1280)
質問にある continueでは、forループの次の回に 移るだけで、多分期待しているであろう whileループの次の回への移行ではありません。 もしこのロジックでやりたいのなら、ラベル付きの continueでループを指定すればよいのでは。 break文とcontinue文 http://www13.plala.or.jp/kymats/study/Java/b7-1.html もっともこのロジックだと配列の要素数が増えるにしたがって 所要時間が加速度的に増えることが予想されるので 素直にshuffleを使ったほうが良いと思いますよ。
お礼
回答ありがとうございます! Shuffleを使うことで、重くならずに処理がおこなえました!
- pcbeginner
- ベストアンサー率46% (261/560)
やりたいことは 1~10をランダムに並べ替える でしたら、先のアドバイスでいけると思います。 >continueでwhile()にもどりますよね? ですが、for文の中のif文のcontinueは、breakの間違いでは? たとえば、t=0のときにbtn_ary[0]とrdmが同じで「continue」まで来たら、 またfor文でtが次の値の処理に入りますよね? for文を抜けてwhile文に戻りたいなら「break」だと思うのですが… あと、ソースには簡単でも良いからコメントを記述した状態で 質問に載せると良いと思いますよ。
- pcbeginner
- ベストアンサー率46% (261/560)
「乱数」だからです。 同じ数が発生しないのは「乱数」ではありませんから。 1~10をランダムに並べ替えたいなら、java.util.Collectionsクラスにshuffleメソッドがあります。
補足
回答ありがとうございます! わかりにくかったでしょうか。。。 for文の中のIF文で、 「配列内と同じ数が出たらもう一回乱数発生させる」 というように記述し、同じ数をはじくようにしています。 しかし、例えば btn_ary[0]が4、rdmも4 というような状況になったとき、IFで評価され、continueでwhile()にもどりますよね? そこがなぜか戻らず困っている状況です。 あ、もしかしてIntではなく乱数っていう特別な数だから、 ==(同じだったら)という評価ができないということですか??
お礼
回答ありがとうございます! Shuffleを使うことで効率よくできました!