- ベストアンサー
4択クイズのランダム出題方法
- JAVAを使って4択クイズの作成をしていますが、5問の問題を連続して表示するプログラムを3問のランダムな出題に変更したいです。
- 乱数を使用してランダムな問題を選ぶ方法を教えてください。
- プログラムの構造や変更点についても教えていただけると幸いです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
すみません回答が遅くなりました 問題の順番を決めてから表示をしますので、init()メソッドの先頭で 順番を入れ替えてから、1問目をGUIにセットするのがいいと思います。 順番を入れ替えているだけなので問題が重複することはありません。 また、問題文(選択肢)を丸ごと入れ替えるのであれば解答がおかしい ということにはならないはずです。 このへんは実際のコードを見てみないと何とも言えません。 問題の順番がランダムで選択肢の入れ替えはないということでいいんですよね? 応用的には選択肢クラスと問題クラスを設計し、問題クラスのメンバとして 選択肢クラスの配列持つといったような考え方をするのがいいと思います。
その他の回答 (3)
- pcbeginner
- ベストアンサー率46% (261/560)
>この方法ですと重複の問題が出てこないでしょうか。 でてきますね。 でも「重複を許可しない」のは「ランダム」じゃありません。 1度出てきたら絶対に出てこない数字があるのはランダムじゃないですよね。 で、1度出てきた数字が出てこないようにするには、 出てきた数字を覚えておいて、2回目以降は飛ばして、次の数字を持ってくる。 でいいのでは?
お礼
さらに回答いただいてありがというございます。 無事解決しました。
- tekebon
- ベストアンサー率62% (36/58)
Math.random()は0.0~1.0未満の値を返します。 そこでこの乱数にデータ数nを掛け、int型にすることで0~(n-1)の ランダムな値を得ることができます。 今回は5問中3問出すということでしたので、重複せずに選ぶ方法として 5問をシャッフルして先頭から3問を使うという方法が考えられます。 ※問題のストック数に対して、使用する問題数がはるかに少なければ ランダムに使用する問題数だけ選んだ方がいいと思います。 「先頭から順にランダムな番号と入れ替える」とすることでシャッフル することができます String tmp[]; for(int i=0; i<question.length; i++){ //先頭から順番に繰り返す k = (int)(Math.random()*question.length);//入れ替える番号をランダムに求める //問題文を入れ替える tmp = question[i]; question[i] = question[k]; question[k] = tmp; } ランダムに使用する問題数だけ選ぶのであればArrayListを 使用すると便利です。 ArrayList#contains()メソッドを使用することで要素の重複を 確認できます。 また2つのArrayListを用意して一方からもう一方へ要素を 移すという方法も考えられます。 ArrayList#remove()で一度選んだものは削除することで 重複しないようにできると思います。
お礼
さらに回答していただいてありがとうございます。 無事解決しました。
補足
詳しくありがとうございます。 またわかりやすいように、実際のプログラムの例文まで書いていただきありがとうございます。 この例文はquestionの乱数によって順番を入れ替えて、順番がランダムになったquestion[k]が指定されると理解しました。ですので、上記のソースのsetQuestion()メソッドの中に入れれば、うまくいくと思いました。 ですが、問題はランダムに表示されるのですが、重複が起きたり、また出題されている問題と違う答えで認識してしまっています。 この例文を上記のソースのどこに入れたらうまくいくのでしょうか。 またinit()メソッドで最初に一番最初の問題を指定しているのですが、最初もランダムに表示させるにはinit()メソッドを使用しないほうが良いのでしょうか。 知識が乏しくて、質問が多くてすいません。 どうか教えてもらえないでしょうか。
- pcbeginner
- ベストアンサー率46% (261/560)
ランダムクラスで乱数を生成して、 取得した乱数を5で割った剰余を問題番号にあてはめれば? ↑を3回繰り返せば擬似的にランダムに3問選べるよ。
お礼
ご回答ありがとうございます。 この方法ですと重複の問題が出てこないでしょうか。 私の質問に重複が出ないようにと書かなかったので、迷惑かけてすいません。 ランダムクラスの知識に乏しいので、勉強したいと思います。
お礼
さらに回答いただいてありがとうございます。 無事解決しました。