使用随机数时间歇性堆栈溢出异常

Kev*_*ung 1 c# stack-overflow random recursion

public int S1x;

public void Execute()
{
    Random random = new Random();
    S1x = random.Next(14, 146);
    if (S1x % 15 != 0)
        Fix(S1x);
}

public int Fix(int SX)
{                
    Random randomG = new Random();
    SX = randomG.Next(14, 146);
    if (SX % 15 != 0)                               
        Fix(SX); // This is the recursion

    return SX;
}
Run Code Online (Sandbox Code Playgroud)

每次运行它都会正常工作,但之后我会尝试再次编译并运行它会给我这个错误:

System.StackOverflowException未处理mscorlib.dll中发生未处理的类型"System.StackOverflowException"异常{无法计算表达式,因为当前线程处于堆栈溢出状态.}

并且,是的,我知道有一种更简单的方法可以做到这一点,但是我的方法是将值设置为等于14到146之间的随机数,同时还要确保它是15的倍数,但仍然可以工作.

我真的很困惑为什么它有时只给我错误信息.

那有什么不对呢?为什么它被标记为无限递归,即使它没有任何无限的东西?

Eri*_*ert 18

即使你解决了这个问题 - 你每次根据当前时间播种时都在创建一个新的Random对象 - 你的代码既不正确也不高效.请记住,递归方法需要具有以下特征才能正确:

  • 在没有递归的情况下可以解决一个小问题
  • 递归步骤使问题变小
  • 有限数量的递归总是将问题简化为一个微不足道的问题

您没有任何这些属性,因此递归是错误的解决方案.

如果您想要一个介于14和146之间的随机数以及15的倍数,则不需要任何递归.唯一这样的数字是15,30,45,60,75,90,105,120和135.所以只说:

private int[] array = { 15, 30, 45, 60, 75, 90, 105, 120, 135 };
private Random random = new Random();
...

return array[random.Next(0, array.Length)];
Run Code Online (Sandbox Code Playgroud)

甚至更好:选择1到9之间的随机数,然后乘以15.

return random.Next(1, 10) * 15;
Run Code Online (Sandbox Code Playgroud)