【问题标题】:Trying to end a while loop once a 1 is randomly generated or it loops 10 times尝试在随机生成 1 或循环 10 次后结束 while 循环
【发布时间】:2021-09-04 04:16:31
【问题描述】:

(我为糟糕的格式道歉)

我正在尝试制作一个随机数生成器(最小值 = 1,最大值 = 10),它会一直循环到其中一个

a) 生成一个 1(作为主要哨兵)。 b) 循环迭代 10 次(次要哨兵)而不产生 1。

我正在寻找这样的东西:

6 3 8 4 1 "5 次尝试收到一个,"

3 8 5 7 2 2 4 8 8 3 “从来没有收到过。”

但问题是,即使生成了 1,循环也会继续,并且“A one was never received”。消息显示。 循环如下:

while (randomNumber.Next() != 1 || loopCounter <= 10));
{
    loopCounter++;
    Console.WriteLine(randomNumber.Next(10));
    Thread.Sleep(100);
    if (randomNumber.Next() == 1)
    {
        Console.WriteLine($"A one was recieved in {loopCounter} attempts.")
        break;
    }
    if (loopCounter <= 10)
    {
        Console.WriteLine("A one was not recieved.")
        break;
    }
}

给予类似的东西

1 4 6 9 7 1 3 3 1 9 “没有收到。”

【问题讨论】:

  • 这里的主要问题是每次迭代调用randomNumber.Next() 三次。只调用一次,并将结果存储在变量中。

标签: c# random while-loop terminate sentinel


【解决方案1】:

你或多或少有正确的想法来推断是否满足这两个条件(除了睡眠线程?)。

但是,如果您在初始化变量以跟踪您正在做的事情之后执行此操作,而不是在进行过程中进行检查,则更容易生成一种满足我假设是家庭作业问题要求的方法。

Random rand = new Random();
int randomNumber = 0;

int maxLoops = 10;
string numbersSoFar = "";

for (int i = 1; i <= maxLoops; i++)
{
    //Generate random number between 1 and 10:
    randomNumber = rand.Next(1, 10);
    numbersSoFar += randomNumber + " ";
    
    if (randomNumber == 1)
    {
        Console.WriteLine(numbersSoFar);
        Console.WriteLine("1 was found on loop number: " + i);
        break;
    }
    else if (i == 10)
    {
        Console.WriteLine(numbersSoFar);
        Console.WriteLine("10 loops completed, no 1 found.");
    } 
}

由于其中一个条件是您拥有最大数量的循环,因此您可以在 for loop 中使用它,而不是在 while 循环中让您访问直接的 iterator 进行比较而不是声明额外的值加上一个while循环。这样,它会自动终止,因为在您的问题中,您还需要一个突破/终止条款。

【讨论】:

    【解决方案2】:

    您的主要问题是 Next() 在每次调用时返回一个新的随机整数,并且没有参数返回任何有效整数,因此您有大约 1/(2^32) 的机会获得 1。相反,您应该调用它在每次迭代中一次并读取该结果几次。您的循环可能如下所示:

    List<int> nums = new List<int>();
    for(int i = 0; i < 10; ++i)
    {
        nums.Add(randomNumber.Next(1, 10));
        if(nums.Last() == 1)
        {
            break;
        }
    }
    Console.Write(String.Join(" ", nums) + " "); 
    if(nums.Last() == 1)
    {
        Console.WriteLine("A 1 was received after " + nums.Length + " attempts");
    }
    else
    {
        Console.WriteLine("A 1 was not received.");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 2019-04-09
      • 2022-10-31
      相关资源
      最近更新 更多