#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:
Если я правильно понимаю вашу цель, вы пытаетесь случайным образом перетасовать список вопросов. Россум дал вам один способ сделать это, и это хорошее введение в наиболее известные варианты.
На мой взгляд, это самый простой подход:
- Создайте карту, которая сортирует по ключу (например
TreeMap <Double,String>
, или<Double,Question>
) - Добавьте случайный ключ и вопрос в качестве значения
- Выполните цикл и распечатайте результаты. Цикл foreach будет использовать порядок сортировки
Не беспокойтесь о повторяющихся случайных числах или их нормализации. Дублирование маловероятно, и если вам нужен вопрос #, добавьте счетчик в цикл.
Ответ №2:
Существует известный стандартный метод перетасовки.
- Выберите один из четырех наугад. При необходимости замените выбранный вами ответ на четвертый.
- Выберите один из оставшихся ответов от 1 до 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. Честно говоря, это мне не очень помогло :/