我有以下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);
   ...

10-06 12:22