我有以下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次后,此方法效果很好,但此后立即给出堆栈溢出异常并停止。我不明白为什么递归不是无限的。
最佳答案
堆栈溢出的原因在第一行:
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);
...