2013-09-25 2 views
0

Я работаю над созданием приложения для викторины для Android. После завершения приложение имеет около 500 вопросов, существующих в нескольких категориях.Android Quiz App - Сделать вопросы Случайные и динамические

Я могу заставить вопросы работать нормально, но только в одном случае: вопросы линейны, что означает, что они всегда появляются в одном порядке, и вопрос всегда имеет одинаковые ответы в одном порядке (так, например, , Вопрос 1 всегда имеет ответы A, B и C, вопрос 2 всегда имеет ответы D, E, F и т. Д.). Я знаю причину этого, потому что я просто заменяю текстовые комментарии, в основном, но только потому, что я не знаю, как делать то, что я пытаюсь сделать.

  1. Я хочу, чтобы вопросы в каждом наборе проходили в случайном порядке без дубликатов. В предыдущем проекте, чтобы выполнить что-то подобное, я создал целое число, которое генерирует случайное значение, а затем проверяет, было ли это значение уже использовано. Тем не менее, это было бы невероятно неэффективно для памяти, и поскольку я работаю над Android-приложением, а не с ПК, это слишком важно, чтобы его игнорировать.
  2. Я хочу, чтобы каждый вопрос имел случайные ответы, отличные от правильного, выбранные из пула возможных ответов. Так, например, если бы я хотел спросить что-то вроде «Кто управлял Великобританией с 1810 по 1820 год» (никакой реальной идеи по ответу), я бы хотел, чтобы один ответ был правильным, а два других - три из пула из 10 европейских правителей. Кроме того, я хочу, чтобы правильный ответ был динамическим, поэтому он не всегда находится в одном и том же месте (так что люди не просто запоминают вопрос и это место ответа).

На данный момент вопросы находятся только в файле java, так как я все еще на этапе предварительной альфа, но я планирую переместить его в базу данных SQLite, как только я получу структуру для проекта. ,

ответ

0

Мое предложение состоит в том, что вы должны рандомизировать порядок массива викторины с целым массивом, который содержит числа от 0 до 499. Все вопросы будут отображаться, но не в том же порядке. Чтобы сделать это, см. этот пост: Random shuffling of an array

второй случай, если я на вашем месте, я сделаю массив ответов, поставлю случайные ответы и возьму случайное число от 0 до 3 для индекса правильного ответа и

answer[random]=correctAnswer; 

с уважением

+0

Ввод ответов в массив, а затем перетасовка их - блестящая идея, которую я не считал, спасибо. Однако другой потенциальной проблемой является то, что для некоторых вопросов я буду использовать изображения вместо текста. Исправьте меня, если я ошибаюсь, но если я использую базу данных SQLite, чтобы вытащить как правильные, так и неправильные ответы, в базе данных я просто поставлю uri для изображения вместо текстовой строки, правильно? – Kezlyr

+0

Я имел в виду перетасовку массива вопросов или массива там индексов 0-499. (а не ответы) и выбрать 4 из 10 ответов случайным образом и заменить один из них правильным ответом также случайным образом. Вы также можете перетасовать ответы и взять с 0-3. Да, вы можете поместить uri изображения или идентификатор изображения. Я хочу, чтобы вы закончили свой проект;) –

0

для 1)

Запишите вопросы, от 1 до N. Выберите случайное число к между одним и числом незатронутый чисел оставшихся (включительно). Подсчитайте с нижнего конца, вычеркните k-ый вопрос, еще не вычеркнутый, и запишите его в другом месте. Повторяйте с шага 2 до тех пор, пока все номера не будут удалены. Последовательность вопросов, записанных на шаге 3, теперь представляет собой случайную перестановку исходных чисел.

это ничего, но .. Фишер Yates Перемешать, который вы могли бы посмотреть на http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

0

Посмотрите на следующий код

//Take a list to store the index of already asked questions 
HashSet<Integer> alreadyAskedQuestions = new HashSet<Integer>(); 

Random random = new Random(); 

//change the number according to your need 
int maxQuestionCount = 500; 

//Continue untill all the questions are completed 
while (alreadyAskedQuestions.size() < maxQuestionCount) { 

    // Get a question that is not already asked 
    int currentQuestionIndex = random.nextInt(maxQuestionCount); 
    while (alreadyAskedQuestions.contains(currentQuestionIndex)) { 
     currentQuestionIndex = random.nextInt(maxQuestionCount); 
    } 

    // do something with current question 

    // Put the answers into a list 
    ArrayList<String> answers = new ArrayList<String>(); 
    answers.add("right answer"); 
    answers.add("wrong answer 1"); 
    answers.add("wrong answer 2"); 
    answers.add("wrong answer 3"); 

    //Shuffle the answers 
    Collections.shuffle(answers); 

    // do something with the answers 

    // put the current question in the already asked list 
    alreadyAskedQuestions.add(currentQuestionIndex); 
} 
0

Если я понял ваш вопрос правильно, вы на самом деле нужен эффективный способ для рандомизировать индекс, по которому размещаются вопросы ....

ли это он даст вам случайное число эффективно

Используйте этот номер в качестве индекса для хранимых вопросов и показать им

int t=(int)System.currentTimeMillis(); 
int index=t%500; 

Access your question 

Questions[index] 

Это даст вопрос всегда в случайном порядке ..

Надеюсь, это поможет вам.

Смежные вопросы