正考虑创建一个支持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;
}
?
答案 0 :(得分:4)
您的程序退出递归调用的能力取决于间隔[min..max]的长度。击中间隔越小,击中StackOverflowException
的概率就越高。
由于您生成4字节整数,因此您有2个 32 可能的值。假设随机值的均匀分布,命中min
和max
之间的间隔的概率等于(max-min)* 2 -32 。继续递归调用的概率是1-(max-min)* 2 -32 。如果您希望递归调用有可能在合理数量的调用内结束,则与{sup> 32 相比,min
和max
之间的间隔应该相当大。
您可以通过将递归代码转换为迭代来避免堆栈溢出,代价是代码相当慢(您的递归实现也是错误的,因为它会丢弃递归调用的结果,但无论如何都不值得修复)。