如何从数组中随机选取元素而不重复?

时间:2017-01-05 09:26:08

标签: android arrays android-studio

我正在开发一个测验应用。我设法用

随机化了问题(来自数组)
int position = new Random().nextInt(questions.length);

但问题不断重复。我如何让它停止到达时可以说10个问题而不重复?如果有帮助,这是我的代码:

gcfQuiz.setText(questions[position]);

    gcfButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

            EditText Answer = (EditText) findViewById(R.id.txtAns1);
            String finAns = Answer.getText().toString();

            if (finAns==answers[position]){

                correct++;
            }
            position++;
            if (position<questions.length)
            {
                gcfQuiz.setText(questions[position]);

            }else {
                Intent in = new Intent(getApplicationContext(), gcfResult.class);
                startActivity(in);
            }
        }
    });

4 个答案:

答案 0 :(得分:2)

您可以使用List,然后删除元素(如果已选择):

List<Question> questions = new ArrayList<Question>();
// For Question class, see below.

// Get some random valid index from the list.
int index = new Random().nextInt(questions.size());
// Remove the question from the list and store it into a variable.
Question currQuestion = questions.remove(i);

为了您的信息,我认为Question类看起来像这样。这种方法通常比分别带有问题和答案的两个独立数组更好:

class Question {

    private String text;
    private String answer;

    public Question(String text, String answer) {
        this.text = text;
        this.answer = answer;
    }

    public boolean isCorrectAnswer(String inputAnswer) {
        return Objects.equals(answer, inputAnswer);
    }
}

一些提示

答案 1 :(得分:1)

    int n=questions.length;
//if n=100 means it give random numb with no duplicate values with in the range 100.
    Random r = new Random();
    Set<Integer> positionvalue = new HashSet<>();
    for(int i = 0; i <n; i++){
            while(true) {
            int number = r.nextInt(n) + 1;
            if (positionvalue.contains(number) == false) {
                positionvalue.add(number);                   
                break;
            }
        }
    }

位置值集在您的范围(n)

之间具有非重复随机数

答案 2 :(得分:1)

取两个全局变量

int nextQuestion;
List<Integer> posList;

然后初始化它:

private void initRandomLogic() {
    nextQuestion = 0;
    posList  = new ArrayList<>();
    for(int i=0;i<questions.length;i++)
        posList.add(i);
    Collections.shuffle(posList);
}

private int getRandomPosition() {
    return posList.get(nextQuestion++);
}
希望能帮到你!

答案 3 :(得分:1)

创建一个问题列表并将其随机播放(通过Collections.shuffle())一次以获得随机的问题顺序:

List<String> randomQuestionList = new ArrayList<>();
randomQuestionList.addAll(Arrays.asList(questions));
Collections.shuffle(randomQuestionList);

现在你有一个随机排列的问题列表。

注意我在您的代码中看到,您在单独的数组中得到了答案。要使这个随机解决方案适合您,您需要一起提问和解答。实现这一目标的最佳方法可能是创建一个包含问题和答案的问题类。然后,您可以随机解决问题,并且仍然可以得到每个问题的答案。

class Question {
    String question;
    String[] answers;
}

List<Question> randomQuestionList ...