生成随机代码时遭遇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
相关产品推荐
相关产品推荐

