c#:用RandomClass循环探测

时间:2016-01-20 17:14:04

标签: c# .net loops random

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

4 个答案:

答案 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异常。

希望这会有所帮助并祝你好运!