总是重复随机选择

时间:2014-03-11 01:30:00

标签: c++ random

我这里有代码。目标是创建一个多项选择测验,其中问题来自文本文件,并随机挑选以显示。我能够做多项选择,问题是当它生成时,已经选择和显示的问题再次显示。此外,选项来自文本文件的答案,但问题是选择是在问题中重复显示。

所以我想知道如何不再显示挑选问题,以及如何不重复显示选择。

示例输出

1. what month do we celebrate Christmas?
a.december
b.december
c.january
d.december



//Randomizes the questionList vector
random_shuffle(questionList.begin(), questionList.end());
//Goes through every Test question

for(int i = 0; i < questionList.size(); i++){
    vector <Test> randomAnswer;     
    //Puts the correct Answer into it first
    randomAnswer.push_back(questionList[i]);
    //Then randomly gets 3 other answers from questionList
    while(randomAnswer.size() < 4)
    {
    int random = rand();
    if(random != i){
        randomAnswer.push_back(questionList[rand() % (questionList.size() - 1)]);
    }            
    //Shuffle the answers
    random_shuffle(randomAnswer.begin(), randomAnswer.end());
    //Print the question
    cout << questionList[i].getQuestion() << ":" << endl;
    //Initialize the first choice character to 'A'
    char ch = 'A';
    //Prints the shuffled answers
    for(int j = 0; j < randomAnswer.size(); j++)
    {
        cout << ch << ") " << randomAnswer[j].getAnswer() << endl;
        //Increment 'A' so it can print 'B' and so forth
        ++ch;
    }
    //Get users response
    cout << "\nYour answer: ";
    cin  >> response;
    //Bool data type to determine if the correct answer was found
    bool isCorrect = false;
    switch(toupper(response)) 
    {
    case 'A':
        if(randomAnswer[0].getAnswer()==questionList[i].getAnswer())
        isCorrect = true;
        break;
    case 'B':
        if(randomAnswer[1].getAnswer()==questionList[i].getAnswer())
        isCorrect = true;
        break;
    case 'C':
        if(randomAnswer[2].getAnswer()==questionList[i].getAnswer())
        isCorrect = true;
        break;
    case 'D':
        if(randomAnswer[3].getAnswer()==questionList[i].getAnswer())
        isCorrect = true;
        break;
    default:
        cout << "\nIncorrect input.\n";
    }
    //If the answer was found print "Correct" else "Wrong"
    if(isCorrect)
    {
        cout << "\nYou got the answer correct!\n";
    }
    else
    {
        cout << "\nYou got the answer WRONG!\n"
        << "Correct answer was " << questionList[i].getAnswer() << 
        endl;

1 个答案:

答案 0 :(得分:1)

您的方法不正确,您在列表中插入正确的答案,然后随机选择三个答案。可视示例(1是正确的):

1 2 3 4
Insert 1 into randomAnswer
Randomly pick three numbers and insert them into randomAnswer: ex (2, 1, 3)

正确的方法是采取所有四个答案并将其洗牌。伪码

swap(questionList[i], *(questionList.end() - 1));
Insert questionList[i]
Shuffle questionList.begin() - questionList.end() - 2 and randomly pick 3