【问题标题】:Android :: How do I randomize my quiz questions?Android :: 我如何随机化我的测验问题?
【发布时间】:2015-06-16 17:14:33
【问题描述】:

我有一个测验应用程序,它显示 SQLite Db 中的几个问题,它有 50 个问题,但它必须在游戏部分显示 5 个问题,并且将这些问题随机化。

我厌倦了很多次的解决方案,但一无所获:/

在源代码中qid是Db。 ID 主键,基于显示问题并找到答案。

这是活动:

package com.example.quiz;

import java.util.List;
import java.util.Random;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.database.DatabaseUtils;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;

public class QuizActivity extends Activity {
    private static final DbHelper remote = null;
    List <Question> quesList;
    int score = 0;

    Question currentQ;
    TextView txtQuestion;
    RadioButton rda, rdb, rdc, rdd;
    Button butNext;

    int qid;
    int qNumber = 0;


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_quiz);
        DbHelper db = new DbHelper(this);

        quesList = db.getAllQuestions();
        currentQ = quesList.get(qid);

        txtQuestion = (TextView)findViewById(R.id.textView1);
        rda = (RadioButton)findViewById(R.id.radio0);
        rdb = (RadioButton)findViewById(R.id.radio1);
        rdc = (RadioButton)findViewById(R.id.radio2);
        rdd = (RadioButton)findViewById(R.id.radio3);
        butNext = (Button)findViewById(R.id.button1);

        setQuestionView();

        butNext.setOnClickListener(new View.OnClickListener() { 

            @Override
            public void onClick(View v) {
                RadioGroup grp=(RadioGroup)findViewById(R.id.radioGroup1);
                RadioButton answer=(RadioButton)findViewById(grp.getCheckedRadioButtonId());

                Log.d("yourans", currentQ.getANSWER()+" "+answer.getText());

                if(currentQ.getANSWER().equals(answer.getText()))
                {
                    score++;
                    Log.d("score", "Your score"+score);
                }

                if(qNumber < 5){    

                    currentQ = quesList.get(qid);
                    setQuestionView();
                }

                else

                {
                    Intent intent = new Intent(QuizActivity.this, ResultActivity.class);
                    Bundle b = new Bundle();
                    b.putInt("score", score); //Pontunk
                    intent.putExtras(b); //Pont tovább vivése a következő kérdéshez
                    startActivity(intent);
                    finish();
                }
            }
        });
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.quiz, menu);
        return true;
    }
    private void setQuestionView()
    {
        txtQuestion.setText(currentQ.getQUESTION());
        rda.setText(currentQ.getOPTA());
        rdb.setText(currentQ.getOPTB());
        rdc.setText(currentQ.getOPTC());
        rdd.setText(currentQ.getOPTD());

        Random rand = new Random(); 
        for(int i=0; i<5;i++){
        int r1 = rand.nextInt(50) + 1;
        qid = r1;
        }
        qNumber++;
    }
}

当qNumber 的值大于5 时,它会重定向到ResultsActivity。 我对其进行了测试,它的工作显示了随机问题,但有时程序会崩溃。 我哪里错了,为什么不正常进行随机化?

感谢您的帮助,对不起我的英语知识!

【问题讨论】:

  • 为什么不选择一个随机的非重复索引,然后在该索引处提取问题?

标签: java android random


【解决方案1】:

您可以通过运行以下查询来获取随机问题:

db.rawQuery("SELECT * FROM YOUR_TABLE ORDER BY RANDOM() LIMIT 5", null);

【讨论】:

  • 感谢您的帮助!我不知道使用 SQL 会更容易。
【解决方案2】:

要做的最重要的事情是检查崩溃信息:它会告诉你去哪里看。

但是,我想我可以看到问题所在。您的随机数生成器返回一个介于 0 和 49 之间的值,然后加 1,将一个值放入 1 到 50 范围内的变量 qid 中。但是 List 是从零开始的,因此当您访问元素 50 时它会崩溃。 (并且永远不会访问问题 0)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 2016-04-06
    • 2017-04-04
    • 1970-01-01
    相关资源
    最近更新 更多