Android测验应用程序 - 使问题随机和动态

时间:2013-09-25 17:52:41

标签: java android sqlite mobile

我正在为Android构建测验应用。完成后,该应用程序有大约500个问题,存在多个类别。

我可以让问题正常工作,但只在一个例子中:问题是线性的,这意味着它们总是以相同的顺序出现,而问题总是以相同的顺序具有相同的答案(例如,问题1总是有答案A,B和C,问题2总是有答案D,E,F等。)我知道原因,因为我只是交换文本视图,基本上,但只是因为我不知道怎么做我想做的事。

  1. 我希望每组中的问题按随机顺序排列,不会重复。在之前的项目中,为了完成类似的操作,我创建了一个生成随机值的整数,然后检查是否已经使用了该值。然而,这将是令人难以置信的内存效率低下,因为我正在开发Android应用程序而不是PC应用程序,这太重要了,不容错过。
  2. 我希望每个问题都有一个随机答案,而不是正确答案,从一组可能的答案中选择。因此,举例来说,如果我问一些诸如“谁从1810-1820统治英国”(对答案没有实际想法),我想要一个答案是正确的,另外两个或三个要采取来自10个欧洲统治者的游泳池。另外,我希望正确答案的位置是动态的,因此它并不总是在同一个位置(所以人们不只是记住问题而是答案的位置)。
  3. 到目前为止,问题只是在java文件中,因为我还处于pre-alpha阶段,但是一旦得到项目的框架,我计划将其移动到SQLite数据库。

4 个答案:

答案 0 :(得分:0)

我的建议是你应该用一个包含0到499之间数字的整数数组随机化测验数组的顺序。所有问题都会显示但不是同一个顺序。要执行此操作,请参阅此帖子:Random shuffling of an array

第二种情况,如果我在你的位置,我会做出答案的数组,随机的答案,并从0到3取一个随机数作为正确答案的索引和

answer[random]=correctAnswer;

此致

答案 1 :(得分:0)

表示1)

记下从1到N的问题。 选择一个与剩余(包括)的未打击数字之间的随机数k。 从低端算起,找出尚未敲定的第k个问题,并将其写在别处。 从步骤2开始重复,直到所有数字都被删除。 在步骤3中记下的问题序列现在是原始数字的随机排列。

这只不过是你可以看到的Fischer Yates Shuffle http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

答案 2 :(得分: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);
}

答案 3 :(得分:0)

如果我理解你的问题,你实际上需要一种有效的方法来随机化索引的问题......

这样做会有效地给你随机数

使用此号码作为存储问题的索引并显示

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

Access your question

Questions[index]

这将始终以随机顺序提出问题。

希望它对你有所帮助。