为什么在尝试使用相同参数运行相同方法时会出现溢出异常?

时间:2018-02-16 12:19:45

标签: c#

正考虑创建一个支持context.awsRequestId的随机数生成器。我必须制作随机uint, long & ulong生成器,但却不得不制作一个min,max生成器。

这就是我所拥有的

uint

为什么在尝试使用相同参数运行相同方法时会得到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; }

1 个答案:

答案 0 :(得分:4)

您的程序退出递归调用的能力取决于间隔[min..max]的长度。击中间隔越小,击中StackOverflowException的概率就越高。

由于您生成4字节整数,因此您有2个 32 可能的值。假设随机值的均匀分布,命中minmax之间的间隔的概率等于(max-min)* 2 -32 。继续递归调用的概率是1-(max-min)* 2 -32 。如果您希望递归调用有可能在合理数量的调用内结束,则与{sup> 32 相比,minmax之间的间隔应该相当大。

您可以通过将递归代码转换为迭代来避免堆栈溢出,代价是代码相当慢(您的递归实现也是错误的,因为它会丢弃递归调用的结果,但无论如何都不值得修复)。