首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >堆栈溢出的可能原因

堆栈溢出的可能原因
EN

Stack Overflow用户
提问于 2015-02-26 14:08:37
回答 1查看 147关注 0票数 1

我有下面的C#代码,它用1到30之间的随机数填充ArrayList。我得给这个函数打25次电话。我的代码:

代码语言:javascript
运行
复制
    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次时,这会很好地工作,但之后它会立即给出堆栈溢出异常并停止。我不明白为什么递归不是无限的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-26 14:15:59

堆栈溢出的原因在第一行:

代码语言:javascript
运行
复制
  private void getNextTrack() {
    int currentTrack = new Random().Next(1, 30); // <- That's the cause

    if (playlist.Contains(currentTrack) ...)
      getNextTrack(); 

每次调用该方法时都会重新创建Random,并且由于Random从系统计时器初始化,因此它一次又一次地返回相同的值。补救措施:将Random从方法中移除:

代码语言:javascript
运行
复制
// Simplest, not thread-safe
private static Random generator = new Random(); 
...
private void getNextTrack()
{
   int currentTrack = generator.Next(1, 30);
   ...
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28744586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档