You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生成随机代码时遭遇System.StackOverflowException异常如何解决?

问题原因分析
  • 无限递归导致栈溢出:当生成的随机数t和上一次的temp相同时,代码直接递归调用CreateRandomCode(codeCount)重新生成整个字符串。如果连续多次出现相同数字,会触发无限递归,耗尽栈内存抛出System.StackOverflowException。
  • Random实例滥用:每次循环甚至递归都创建新的Random实例,且用i * temp * (int)DateTime.Now.Ticks做种子。短时间内DateTime.Ticks变化极小,多次创建的Random实例会生成重复的随机序列,大幅提高连续生成相同数字的概率,加剧递归问题。
修复方案

核心修改点

  • 移除递归逻辑,在当前循环内重新生成随机数,直到与上一次的数字不同
  • 仅创建一次Random实例,避免重复创建导致的随机序列重复
  • 用StringBuilder代替字符串拼接+=,提升大长度字符串的生成性能

修改后的代码

protected void btnOrder_Click(object sender, EventArgs e)
{
    string OrderId = "TEK" + CreateRandomCode(15);
}

public string CreateRandomCode(int codeCount = 15)
{
    string allChar = "0,1,2,3,4,5,6,7,8,9";
    string[] allCharArray = allChar.Split(',');
    StringBuilder randomCode = new StringBuilder();
    int temp = -1;
    // 只创建一次Random实例,避免重复生成相同序列
    Random rand = new Random();

    for (int i = 0; i < codeCount; i++)
    {
        int t;
        do
        {
            t = rand.Next(10);
            // 仅非第一个字符时检查是否与上一个重复
        } while (temp != -1 && t == temp);
        
        temp = t;
        randomCode.Append(allCharArray[t]);
    }
    return randomCode.ToString();
}

额外优化建议

  • 如果不需要严格禁止连续重复数字,可以直接去掉重复检查逻辑,彻底避免递归相关问题
  • 若要生成全局唯一的订单号,建议结合时间戳+随机数的方式,或者使用Guid.NewGuid().ToString("N").Substring(0,15),比纯随机数更可靠

内容的提问来源于stack exchange,提问作者SauravT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 07:52:26