问题描述
(对于粗暴的格式我深表歉意)
我正在尝试制作一个随机数生成器(最小 = 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”。消息显示。 循环如下:
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/(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.");
}