【问题标题】:Making sure the same list output doesn't come up twice确保相同的列表输出不会出现两次
【发布时间】:2013-02-10 13:09:51
【问题描述】:

我正在制作一种自我测验,您可以在其中添加问题然后进行自我测验。

我希望能够向您提出所有问题(如果可能,随机提出)。 我已经让它有点工作,但它偶尔会错过一些问题或重复它们。

public void LoadUp() {
    if(TimeLimit) {
        timer2.Start();
    }

    KeyWords.Clear();
    Hint_Used=false;
    int QuestionCount=correct+incorrect;
    int AnswerCount=Study_Helper.Form1.QuizList.Count;
    Random random=new Random();
    int randomNumber=random.Next(0, Study_Helper.Form1.QuizList.Count);

    if(!Study_Helper.Form1.PreviousQuestions.Contains(randomNumber)) {
        Study_Helper.Form1.PreviousQuestions.Add(randomNumber);
        String raw=Study_Helper.Form1.QuizList[randomNumber].ToString();
        String[] Split=raw.Split(new char[] { '|' });
        Question=Split[0];
        richTextBox1.Text=Question;
        Answer=Split[1];
        Hint=Split[2];
        String[] NewSplit=Split[3].Split(new char[] { ',' });
        int TotalKeywords=0;

        foreach(string s in NewSplit) {
            TotalKeywords++;
        }

        for(int size=0; size<TotalKeywords-1; size++) {
            String KeyWord=NewSplit[size].ToString();
            KeyWords.Add(KeyWord);
        }
    }
    else if(QuestionCount>=AnswerCount) {
        int Total=correct-incorrect;

        if(Total<0) {
            Total=0;
        }

        timer2.Stop();
        Counter=Study_Helper.Form4.Counter;
        Form6 form6=new Form6();
        form6.Show();
        TimeLimit=false;
        MessageBox.Show("Study Questions over! you got "+Total+" in total, that's "+correct+" correct answers!", "Results", MessageBoxButtons.OK, MessageBoxIcon.Information);
        correct=0;
        incorrect=0;
        this.Close();
    }
}

它所做的是将随机数添加到保存它的列表中,并检查是否已经包含它。我觉得我遗漏了一些明显的东西来流畅地完成这项工作。

【问题讨论】:

  • 请编辑sn-p代码,只留下有意义的部分。

标签: c#


【解决方案1】:

我认为使用PreviousQuestions 跟踪所有索引会让您自己复杂化。我建议在开始时对索引进行洗牌,因此一旦您使用此方法初始化了堆栈,您只需调用 randomNumbers.Pop() 即可获取新的随机数。

Stack<int> ShuffleNumbers(int count)
{
    IEnumerable<int> range = Enumerable.Range(0, count);
    Random rnd = new Random();
    return new Stack<int>(range.OrderBy(x => rnd.Next()));
}

【讨论】:

    【解决方案2】:

    最简单的方法是将列表随机化,然后按顺序开始处理。

    var randomizedList = Study_Helper.Form1.QuizList.OrderBy(a => Guid.NewGuid());
    
    foreach(var question in randomizedList)
    {
        //Handle displaying the question.
    }
    

    这样做是对列表进行“排序”,但是因为我们每次都给排序器一个新的随机1Guid,所以它会随机化列表。然后我们可以使用这个打乱的测验来完成剩下的代码。

    1. 这不是一种“安全”的随机方式,因为有人可以对输出进行密码分析以预测问题的顺序,但您并不是在尝试加密安全,您只是在尝试争夺测验问题,这个解决方案就足够了。有关更多信息,请参阅this SO question 洗牌。

    【讨论】:

      猜你喜欢
      • 2013-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      相关资源
      最近更新 更多