Не удается заставить этот код работать должным образом

#java #android

#java #Android

Вопрос:

Как мне заставить его показывать ответы случайным образом в одной из 4 строк без каких-либо дубликатов?

Мой текущий код:

 TextView question;
private int qType = -1;
private int asked = 0;
private void QBegin() {
    /*
     * Gets a random question
    */
    question = (TextView) findViewById(R.id.question);
    String[] types = { "Q1", "Q2", "Q3", "Q4", "Q5"};
    Random random = new Random();
    int qType = random.nextInt(types.length);
    question.setText(types[qType]);
    asked  ;
   // StringList.add(types[qType]);
    getAnswers(qType);
 /*   if(StringList.contains(types[qType]) amp;amp; asked >= types.length 1){
        asked = 0;
        answerCounter.setText("THE END");
    } else if (StringList.contains(types[qType]) amp;amp; asked < types.length 1){
        QBegin();
    } */
}
     public static int random(int range) {
    return (int)(java.lang.Math.random() * (range 1));
}

public void shuffle(String input){
    /*
     * Unused shuffle method
     */
    List<Character> characters = new ArrayList<Character>();
    for(char c:input.toCharArray()){
        characters.add(c);
    }
    StringBuilder output = new StringBuilder(input.length());
    while(characters.size()!=0){
        int randPicker = (int)(Math.random()*characters.size());
        output.append(characters.remove(randPicker));
    }
    System.out.println(output.toString());
}
private void getAnswers(int Type) {
    /* 
     * Getting answers here
     */
    int randomValue = random(4);
    try { 
    String answers_list[][] = {
            {"Answer 1-1", "Answer 2-1", "Answer 3-1", "Answer 4-1"}, 
            {"Answer 1-2", "Answer 2-2", "Answer 3-2", "Answer 4-2"},
            {"Answer 1-3", "Answer 2-3", "Answer 3-3", "Answer 4-3"},
            {"Answer 1-4", "Answer 2-4", "Answer 3-4", "Answer 4-4"},
            {"Answer 1-5", "Answer 2-5", "Answer 3-5", "Answer 4-5"}} ;
    answer1.setText(answers_list[Type][randomValue 1 > 3 ? (randomValue 0)-4 : randomValue 0]); 
    answer2.setText(answers_list[Type][randomValue 2 > 3 ? (randomValue 1)-3 : randomValue 1]); 
    answer3.setText(answers_list[Type][randomValue 3 > 3 ? (randomValue 2)-2 : randomValue 2]); 
    answer4.setText(answers_list[Type][randomValue 0 > 3 ? (randomValue 3)-4 : randomValue 3]);


    /*for (int rows = 0; rows < answeramp;*list.length; rows  ){
    for (int cols = 0; cols < answers_list[rows].length; cols  ){   
      }
        }*/
    } catch(Exception ex){
    answer1.setText("Error " ex);
    }



}
  

Код, который отвечает за выбор и добавление вопросов в одну из 4 строк (случайным образом)

     answer1.setText(answers_list[Type][randomValue 1 > 3 ? (randomValue 0)-4 : randomValue 0]); 
    answer2.setText(answers_list[Type][randomValue 2 > 3 ? (randomValue 1)-3 : randomValue 1]); 
    answer3.setText(answers_list[Type][randomValue 3 > 3 ? (randomValue 2)-2 : randomValue 2]); 
    answer4.setText(answers_list[Type][randomValue 0 > 3 ? (randomValue 3)-4 : randomValue 3]);
  

На данный момент у меня есть дубликаты с answer1 и answer4. Пожалуйста, помогите.

Комментарии:

1. Это… неясно, что здесь происходит, или как вы это реализуете. По сути, вы пытаетесь получить список из четырех случайных чисел без дубликатов?

2. Да, это то, что я пытаюсь сделать.

Ответ №1:

Если я правильно понимаю вашу цель, вы пытаетесь случайным образом перетасовать список вопросов. Россум дал вам один способ сделать это, и это хорошее введение в наиболее известные варианты.

На мой взгляд, это самый простой подход:

  1. Создайте карту, которая сортирует по ключу (например TreeMap <Double,String> , или <Double,Question> )
  2. Добавьте случайный ключ и вопрос в качестве значения
  3. Выполните цикл и распечатайте результаты. Цикл foreach будет использовать порядок сортировки

Не беспокойтесь о повторяющихся случайных числах или их нормализации. Дублирование маловероятно, и если вам нужен вопрос #, добавьте счетчик в цикл.

Ответ №2:

Существует известный стандартный метод перетасовки.

  1. Выберите один из четырех наугад. При необходимости замените выбранный вами ответ на четвертый.
  2. Выберите один из оставшихся ответов от 1 до 3 случайным образом. При необходимости замените тот, который вы выбрали, ответом в третьей позиции.
  3. Выберите один из оставшихся ответов от 1 до 2 случайным образом. При необходимости замените тот, который вы выбрали, ответом на второй позиции.

Теперь у вас есть перетасованный список, содержащий исходные четыре ответа в случайном порядке. Этот алгоритм называется перетасовкой Фишера-Йейтса.

ETA простой пример кода:

 Random rand = new Random();

String[] answers = { "42",
                     "Only on a Tuesday.",
                     "$4.36",
                     "Hieronymous K. Sluggenheimer III" };

// Shuffle answers[]
for (int i = 3; i > 0; --i) {
    // Pick an answer that hasn't yet been chosen.
    int pick = rand.nextInt(i   1);
    if (pick != i) {
        // Exchange answers[i] and answers[pick].
        String temp = answers[i];
        answers[i] = answers[pick];
        answers[pick] = temp;
    }
}
  

Комментарии:

1. Ммм, можете ли вы изменить мой код для меня, потому что ваши утверждения немного сбивают меня с толку.

2. Честно говоря, это мне не очень помогло :/