我有下面的C#代码,它用1到30之间的随机数填充ArrayList。我得给这个函数打25次电话。我的代码:
private void getNextTrack()
{
int currentTrack = new Random().Next(1, 30);
if (playlist.Contains(currentTrack) || (topicNo == 8 && currentTrack == 29) || (topicNo == 3 && currentTrack == 14))
getNextTrack(); //If track already exsits or the 2 specified topics dont have that track no. then try again.
else
{
playlist.Add(currentTrack);
++tracksPlayed;
}
}
当函数被调用初始10-11次时,这会很好地工作,但之后它会立即给出堆栈溢出异常并停止。我不明白为什么递归不是无限的。
发布于 2015-02-26 14:15:59
堆栈溢出的原因在第一行:
private void getNextTrack() {
int currentTrack = new Random().Next(1, 30); // <- That's the cause
if (playlist.Contains(currentTrack) ...)
getNextTrack();
每次调用该方法时都会重新创建Random
,并且由于Random
从系统计时器初始化,因此它一次又一次地返回相同的值。补救措施:将Random
从方法中移除:
// Simplest, not thread-safe
private static Random generator = new Random();
...
private void getNextTrack()
{
int currentTrack = generator.Next(1, 30);
...
https://stackoverflow.com/questions/28744586
复制相似问题