尝试在随机生成1或循环10次后结束while循环



(我为糟糕的格式道歉(

我正在尝试制作一个随机数生成器(min=1,max=10(,它循环直到

a(生成一个1(用作主要哨兵(。b( 循环迭代10次(次要哨兵(,但不生成1。

我正在寻找这样的东西:

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

3 8 5 7 2 2 4 8 3"一个也没有收到">

但问题是即使产生1循环也继续;从来没有收到过"显示消息。循环如下:

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";一个没有收到">

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

但是,如果你在初始化变量以跟踪你正在做的事情,而不是边做边检查,那么就更容易产生一种满足我假设的家庭作业问题要求的方法。

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循环耦合的额外值。这样,它会自动终止,就像在你的问题中一样,你需要额外的突破/终止条款。

您的主要问题是Next()在每次调用时都会返回一个新的随机整数,并且在没有参数的情况下会返回任何有效整数,因此您获得1的几率约为1/(2^32(。相反,您应该在每次迭代中调用它一次,并将结果读取几次。你的循环可能看起来像这样:

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.");
}

最新更新