public void machine()
{
Random RandomClass = new Random();
int a = RandomClass.Next(1,9);
if(a==1)
{
if (pictureBox1.Image == img0) { pictureBox1.Image = img2; }
else
{
machine();
}
}
erreur : Une exception non gérée du type 'System.StackOverflowException' s'est produite dans WindowsFormsApplication2xo.exe
答案 0 :(得分:2)
现在,你的循环退出的可能性只有10%左右 - 只有当1到9之间的随机数正好为1时才会发生。在所有其他情况下,你再次调用该函数。如果经常发生这种情况,您将获得StackOverflowException
。有时你会很幸运,递归会在此之前结束。
显而易见的解决方案是删除递归。这解决了代码的另一个问题:每次进入函数时,都会创建一个新的随机数生成器。理想情况下,您应该创建一次并播种,并在每次需要新的随机数时在该单个实例上调用Next
。
另外,你的名字对C#程序员来说有点奇怪。通常我们用小写命名局部变量,用大写命名函数:
public void Machine()
{
Random randomNumberGenerator = new Random();
int a;
while(true)
{
a = randomNumberGenerator.Next(1,9);
if(a == 1)
{
if (pictureBox1.Image == img0) { pictureBox1.Image = img2; }
break;
}
}
}
最后,这个循环不是很有用。我猜你可能是为了扩展身体来处理更多的数字,在这种情况下我会建议switch
而不是这个奇怪的嵌套if
- 构造。
答案 1 :(得分:1)
由于我没有看到正确答案:
class Program
{
private static Random rand = new Random();
static void Main(string[] args)
{
machine();
}
private static void machine()
{
if (rand.Next(1, 9) == 1)
Console.WriteLine("We did it!");
else
machine();
}
}
在这里,您可以指定最大深度,这样就不会溢出堆栈。
注意:如果正确初始化随机数,则不需要这样做。
private static void machine(int depth)
{
if (rand.Next(1, 9) == 1 || depth > 1000)
Console.WriteLine("We did it!");
else
machine(++depth);
}
答案 2 :(得分:1)
由于您在注释中指出要处理所有可能的结果,因此您不应该使用任何类型的递归或循环。
然后,正如最后指出的那样,唯一需要修复的问题是你必须重新使用随机数生成器。
另请注意,Random.Next
的上限是独占的:
返回的随机数的独占上限。 Source
所以你需要的就是
private Random randomNumberGenerator = new Random();
public void machine()
{
int boxNumber = RandomClass.Next(1, 9);
switch(boxNumber)
{
case 1:
if (pictureBox1.Image == img0) { pictureBox1.Image = img2; }
// ...
break;
case 2:
if (pictureBox1.Image == img0) { pictureBox1.Image = img2; }
// ...
break;
// ...
case 8: // a will be at most 8
// ...
break;
}
}
答案 3 :(得分:0)
首先,你有一个括号不匹配。你想做什么:
public void machine()
{
Random RandomClass = new Random();
int a = RandomClass.Next(1,9);
if(a==1)
{
if (pictureBox1.Image == img0) {
pictureBox1.Image = img2;
}
}
else
{
machine();
}
}
或者这个:
public void machine()
{
Random RandomClass = new Random();
int a = RandomClass.Next(1,9);
if(a==1)
{
if (pictureBox1.Image == img0) {
pictureBox1.Image = img2;
}
else
{
machine();
}
}
}
正如许多用户所说,您不需要继续创建新的Random
对象。事实上,在这种情况下,使用循环比使用递归更好。
以下是一个例子:
public void machine()
{
Random RandomClass = new Random();
// Not sure what the point of the random is but whatevs
int a = RandomClass.Next(1,9);
for (; a != 1; a = RandomClass.Next(1,9));
if (pictureBox1.Image == img0) {
pictureBox1.Image = img2;
}
}
注意:虽然极不可能,但无法保证此功能永远不会结束。但是,使用循环而不是递归只会导致计算机响应更差,风扇变得疯狂而不是抛出Stack Overflow
异常。
希望这会有所帮助并祝你好运!