プロが教えるわが家の防犯対策術!

JAVAにて4択クイズの作成をしているのですが、下記は5問の問題を連続して表示するプログラムなんですが、これは5問の中から3問をランダムで表示させるようにしたいのですが、どのようにしたら良いのでしょうか。
乱数を使うのも考えたのですが、どのように入れていけばわからないです。よろしければ教えて下さい。

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class kake extends Applet implements ActionListener{
private Checkbox CB[];
private CheckboxGroup CBG;
private Button BT;
private Label QL, PL;
private Panel P1, P2;
private String[][] question = {
{"問題1","A","B","C","D","1"},
{"問題2","A","B","C","D","2"},
{"問題3","A","B","C","D","3"},
{"問題4","A","B","C","D","4"},
{"問題5","A","B","C","D","1"},
};

private int rightAns, count;

public void init(){
rightAns = Integer.parseInt(question[0][5]);
count = 0;
CB = new Checkbox[4];
setLayout(new GridLayout(5, 1));
CBG = new CheckboxGroup();
add(QL = new Label(question[0][0]));
add(P1 = new Panel(new GridLayout(1, 2)));
P1.add(CB[0] = new Checkbox(question[0][1], CBG, true));
P1.add(CB[1] = new Checkbox(question[0][2], CBG, false));
add(P2 = new Panel(new GridLayout(1, 2)));
P2.add(CB[2] = new Checkbox(question[0][3], CBG, false));
P2.add(CB[3] = new Checkbox(question[0][4], CBG, false));
add(BT = new Button("答える"));
BT.addActionListener(this);
BT.setActionCommand("BT");
add(PL = new Label(""));
}

public void actionPerformed(ActionEvent ae){
try{
if(ae.getActionCommand().compareTo("BT") == 0){
if(CB[rightAns].getState()){
judgement(true);
}
else{
judgement(false);
}
setQuestion();
}
}
catch(Exception e){
PL.setText(e.toString());
}
}

private void setQuestion(){
QL.setText(question[count][0]);
rightAns = Integer.parseInt(question[count][5]);
CB[0].setLabel(question[count][1]);
CB[1].setLabel(question[count][2]);
CB[2].setLabel(question[count][3]);
CB[3].setLabel(question[count][4]);
repaint();
}
private void judgement(boolean ans){
String result;
if(ans == true){
result = "正解";
}
else{
result = "不正解";
}
if(count == 9){
PL.setText(result);
}
else{
PL.setText(result);
count++;
}
}
}

A 回答 (4件)

すみません回答が遅くなりました



問題の順番を決めてから表示をしますので、init()メソッドの先頭で
順番を入れ替えてから、1問目をGUIにセットするのがいいと思います。

順番を入れ替えているだけなので問題が重複することはありません。
また、問題文(選択肢)を丸ごと入れ替えるのであれば解答がおかしい
ということにはならないはずです。
このへんは実際のコードを見てみないと何とも言えません。

問題の順番がランダムで選択肢の入れ替えはないということでいいんですよね?

応用的には選択肢クラスと問題クラスを設計し、問題クラスのメンバとして
選択肢クラスの配列持つといったような考え方をするのがいいと思います。
    • good
    • 1
この回答へのお礼

さらに回答いただいてありがとうございます。
無事解決しました。

お礼日時:2011/12/07 05:50

>この方法ですと重複の問題が出てこないでしょうか。


でてきますね。
でも「重複を許可しない」のは「ランダム」じゃありません。
1度出てきたら絶対に出てこない数字があるのはランダムじゃないですよね。

で、1度出てきた数字が出てこないようにするには、
出てきた数字を覚えておいて、2回目以降は飛ばして、次の数字を持ってくる。
でいいのでは?
    • good
    • 0
この回答へのお礼

さらに回答いただいてありがというございます。
無事解決しました。

お礼日時:2011/12/07 05:49

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()メソッドを使用しないほうが良いのでしょうか。

知識が乏しくて、質問が多くてすいません。
どうか教えてもらえないでしょうか。

補足日時:2011/11/30 05:28
    • good
    • 0
この回答へのお礼

さらに回答していただいてありがとうございます。
無事解決しました。

お礼日時:2011/12/07 05:48

ランダムクラスで乱数を生成して、


取得した乱数を5で割った剰余を問題番号にあてはめれば?
↑を3回繰り返せば擬似的にランダムに3問選べるよ。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
この方法ですと重複の問題が出てこないでしょうか。
私の質問に重複が出ないようにと書かなかったので、迷惑かけてすいません。
ランダムクラスの知識に乏しいので、勉強したいと思います。

お礼日時:2011/11/30 05:30

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