0

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

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

  1. 我希望每组中的问题以随机顺序排列,没有重复。在之前的项目中,为了完成类似的事情,我创建了一个整数,它会生成一个随机值,然后检查该值是否已被使用。但是,这将是令人难以置信的内存效率低下,并且由于我正在开发 Android 应用程序而不是 PC 应用程序,因此这一点太重要了,不容忽视。
  2. 我希望每个问题都有随机答案,而不是正确的答案,从一组可能的答案中选择。因此,例如,如果我要问诸如“谁在 1810 年至 1820 年统治英国”之类的问题(对答案没有实际想法),我希望一个答案是正确的,而另外两个或三个被采纳来自 10 位欧洲统治者。此外,我希望正确答案的位置是动态的,因此它并不总是在同一个位置(因此人们不只是记住问题及其答案的位置)。

到目前为止,这些问题只是在一个 java 文件中,因为我仍处于 pre-alpha 阶段,但我计划在弄清楚项目框架后将其移动到 SQLite 数据库。

4

4 回答 4

0

1)

写下从 1 到 N 的问题。在 1 和剩余未击中的数字(包括)之间选择一个随机数 k。从低端数,把第k个没有被划掉的问题划掉,写在别处。从步骤 2 开始重复,直到所有数字都被删除。在步骤 3 中写下的问题序列现在是原始数字的随机排列。

这不过是.. Fischer Yates Shuffle,您可以查看 http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

于 2013-09-25T18:21:19.710 回答
0

如果我正确理解了您的问题,那么您实际上需要一种有效的方法来随机化放置问题的索引....

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

将此号码用作存储问题的索引并显示它们

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

Access your question

Questions[index]

这将始终以随机顺序给出一个问题..

希望它可以帮助你。

于 2013-09-25T19:21:02.897 回答
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);
}
于 2013-09-25T18:47:07.590 回答
0

我的建议是您应该使用包含 0 到 499 数字的整数数组随机化测验数组的顺序。所有问题都会显示,但顺序不同。为此,请参阅这篇文章:数组的随机洗牌

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

answer[random]=correctAnswer;

问候

于 2013-09-25T18:14:42.740 回答