C# 为什么在尝试使用相同的参数运行相同的方法时会出现溢出异常?
正在考虑创建一个支持uint、long和ulong的随机数生成器。我开始做随机的uint生成器,但是我一直在做一个最小,最大的生成器 这就是我所拥有的C# 为什么在尝试使用相同的参数运行相同的方法时会出现溢出异常?,c#,C#,正在考虑创建一个支持uint、long和ulong的随机数生成器。我开始做随机的uint生成器,但是我一直在做一个最小,最大的生成器 这就是我所拥有的 public class Rand : System.Random public uint UInt32(uint min, uint max) { byte[] array = new byte[4]; base.NextBytes(array); uint result = BitConverter.ToUInt
public class Rand : System.Random
public uint UInt32(uint min, uint max)
{
byte[] array = new byte[4];
base.NextBytes(array);
uint result = BitConverter.ToUInt32(array, 0);
if (result < min | result > max)
{
UInt32(min, max); //here i get a StackOverflowException
}
return result;
}
为什么在尝试使用相同参数运行相同方法时会出现StackOverflowException?您的程序退出递归调用的能力取决于间隔的长度[min..max]。间隔越小,命中StackOverflowException的概率越高 由于生成的是4字节整数,因此有232个可能的值。假设随机值均匀分布,命中最小值和最大值之间间隔的概率等于最大值最小值*2-32。继续递归调用的概率为1-max-min*2-32。如果希望递归调用有机会在合理的调用次数内结束,那么与232相比,min和max之间的间隔应该相当大
通过将递归代码转换为迭代代码,您可以避免堆栈溢出,但代价是代码速度较慢。您的递归实现也是错误的,因为它会丢失递归调用的结果,但无论如何都不值得修复。您是否尝试过调试它,以一步一步地查看它实际在做什么,观察变量?您可能会回答自己的问题。基本上,您永远不会从递归函数返回。如果result