C# 为什么这个代码两次给出相同的问题?

C# 为什么这个代码两次给出相同的问题?,c#,visual-studio,winforms,C#,Visual Studio,Winforms,我正在用winform创建一个测验,其功能是该代码生成rand number,然后给出以下问题。但当我开始的时候,有时它不会产生一个问题,所以我按了两次,有时它会产生两次相同的问题。我如何改进这个代码并使其生成一个数字,如果该数字与if语句相同,它将给出问题,否则它将再次生成一个数字并执行相同的操作 Random number = new Random(); int questionnumber = number.Next(1, 5); List<int>

我正在用winform创建一个测验,其功能是该代码生成rand number,然后给出以下问题。但当我开始的时候,有时它不会产生一个问题,所以我按了两次,有时它会产生两次相同的问题。我如何改进这个代码并使其生成一个数字,如果该数字与if语句相同,它将给出问题,否则它将再次生成一个数字并执行相同的操作

    Random number = new Random();
    int questionnumber = number.Next(1, 5);

    List<int> generatednumber = new List<int>();
    generatednumber.Add(questionnumber);


    if (questionnumber == 1 & generatednumber.Count != 1)
    {
        groupBox1.Visible = true;
        label2.Text = "Eine Variable besteht aus...?";
        radioButton1.Text = "Name";
        radioButton2.Text = "Datentyp";
        radioButton3.Text = "Wert";
        radioButton4.Text = "Alle oberen 3";
        radioButton5.Text = "Nur aus Name und Datentyp";

    }
    else
    {
        if (questionnumber == 2 & generatednumber.Count != 2)
        {
            groupBox1.Visible = true;
            label2.Text = "Es gibt ... schleifen";
            radioButton1.Text = "2";
            radioButton2.Text = "3";
            radioButton3.Text = "4";
            radioButton4.Text = "Nur 1";
            radioButton5.Text = "Es gibt kein schleifen";


        }
        else
        {
            if (questionnumber == 3 & generatednumber.Count != 3)
            {
                groupBox1.Visible = true;
                label2.Text = "Was beschriebt ein  character 'char' Datentyp?";
                radioButton1.Text = "Nummer";
                radioButton2.Text = "Sätze";
                radioButton3.Text = "Nummer mit kommazahlen";
                radioButton4.Text = "Buchstaben";
                radioButton5.Text = "Es gibt kein 'char' Datentyp";

            }
            else
            {
                if (questionnumber == 4 & generatednumber.Count != 4)
                {
                    groupBox1.Visible = true;
                    label2.Text = "5%4 ergibt...?";
                    radioButton1.Text = "0";
                    radioButton2.Text = "2";
                    radioButton3.Text = "1";
                    radioButton4.Text = "-3";
                    radioButton5.Text = "Nicht definiert";
                }
                else
                {
                    if (questionnumber == 5 & generatednumber.Count != 5)
                    {
                        groupBox1.Visible = true;
                        label2.Text = "string Name='Test by Bishow'; \n Console.WriteLine(Name.Length); ergibt..?";
                        radioButton1.Text = "3";
                        radioButton2.Text = "Test by Bishow";
                        radioButton3.Text = "13";
                        radioButton4.Text = "1";
                        radioButton5.Text = "4";

                    }
                    else
                    {

                    }

我想你必须把代码改成这样。我创建了一个要调用的新方法,它将显示您的问题。确保在类结构的方法之外声明随机数并列出生成的numer

Random number = new Random();
List<int> generatedNumbers = new List<int>();

private void GetNewRandomQuestion(){
   if (generatedNumbers.Count >= 5){ // Since you only have five questions, there can only be five unique numbers. The code below would get stuck
       throw new Exception(); 
   }
   int questionNumber = number.Next(1, 5);
   while (generatedNumbers.Contains(questionNumber)){   // Generate new number until there is a unique one
      questionNumber = number.Next(1, 5);
   } 
   generatedNumbers.Add(questionNumber);
   // The code above made sure the question wasnt there already. You only have to check the questionnumber now

   if (questionNumber == 1){
       //...
   }
   else if {
      //...
  } //...
}

声明号码超出范围method@viveknuna你的意思是随机数=新的随机数;int questionnumber=number.Next1,5;若要在外部声明,您还应该使用&&而不是&也许您可以有一个问题列表并将其洗牌。然后一个接一个地送过去。这样,在你列举问题的随机列表时,同一个问题就不会被挑两次。你还可以将文本存储在课堂上,以使所有这些都可读。这样你就不会有这种奇怪的if-else-if-else,而是有一个漂亮的对象数组。如果你想问一个问题,你可以使用索引,瞧,非常感谢你的帮助。我只是想问你我是否理解正确:while generatedNumbers.containsQuestionnumbers是否检查生成的号码是否在列表中?如果generatedNumbers.Count>=5{throw new Exception;}@Henry您只有五个问题,每个问题应该只显示一次,那么我不知道这段代码实际上做了什么。因此,如果每个问题都已显示generatedNubmers count将为5,则不再显示任何问题,因此该方法不应显示任何其他问题。您可以显示一个消息框,显示他每天回答的用户,而不是抛出错误question@DragandDrop当然,这是低效的,尤其是对于最后的问题。但由于他只有五个问题,所以执行这段代码只需要几毫秒。对于五个问题来说,这就足够了,而且对于像他这样的初学者来说,这段代码仍然简单易懂。Random不会这样工作。Random没有问题,在您预期的更长时间内不提供最后一个数字。即使是这样的短程飞行。许多研究要求学生在有时间时写随机数。而人类真的是随机的。有些种子连续尝试20次以上都无法生成正确的编号。你每卷只有1/5。这是1-4/5^20~98%。但这并没有解决逻辑问题。我编写了一个小基准测试:对于1亿次迭代,每次迭代都会创建一个新的随机数和一个新的种子,算法大约需要2,1个滴答声210ns才能找到1-5范围内的5个滴答声,最大峰值为23600个滴答声2,36ms。即使对于1-100范围内的较大数字100,平均只需要7,9个滴答声790ns,一个44056个滴答声4,4ms的峰值。我明白你的问题,但对于这么小的数字来说没有意义。以下是基准: