确保相同的列表输出不会';Don’不要上来两次
本文关键字:两次 Don 列表 输出 确保 | 更新日期: 2023-09-27 17:58:43
我正在制作一种自我测验器,您可以添加问题,然后对自己进行测验。
我希望能够把所有的问题都交给你(如果可能的话,随机分组)。我已经有了一些工作,但它偶尔会漏掉一些问题或重复这些问题。
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();
}
}
它所做的是将随机数添加到包含它的列表中,并检查是否已经包含它。我觉得我缺少了一些明显的东西来使它流畅地工作。
我认为使用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()));
}
最简单的方法是将列表随机化,然后按顺序开始处理。
var randomizedList = Study_Helper.Form1.QuizList.OrderBy(a => Guid.NewGuid());
foreach(var question in randomizedList)
{
//Handle displaying the question.
}
这是对列表进行"排序",但因为我们每次都会给分类器一个新的随机1Guid
,所以它会随机化列表。然后,我们可以在代码的其余部分使用这个加扰的测试。
1。这不是一种"安全"的随机方式,因为有人可以对输出进行密码分析来预测问题的顺序,但你并不是在试图加密安全,你只是在试图扰乱问答问题,这个解决方案就足够了。请参阅这个关于洗牌的SO问题,了解更多信息