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

Unity因疑似无限循环崩溃,求排查随机数生成器代码问题

0-29随机数选取器的无限循环问题修复与规则实现

问题根源

你的代码直接导致Unity卡死的原因有三个:

  1. 外层循环永远无法终止:ENDINGVAR初始设为0,循环条件ENDINGVAR < 30,但整个循环里没有任何代码更新ENDINGVAR的值,这个while会无限跑下去。
  2. 数组初始化不完整:ews30是长度30的数组,但初始化循环只遍历到索引28(i < ews30.Length -1),最后一个元素ews30[29]保留默认值0。当随机到0时,会被误判为已存在,内层循环会一直找不到可用数字。
  3. 随机数范围错误:random.Next(0,29)是左闭右开区间,只能生成0-28的数字,永远选不到29。

另外原代码也没实现「选中17后需等所有其他数字选完才能再选」的规则,只是单纯做了一轮不重复选取。

修复并实现规则的代码

下面的代码用集合管理数字,既解决无限循环问题,又满足特殊数字的选取规则:

using System.Collections.Generic;
using UnityEngine;

public class NumberPicker : MonoBehaviour
{
    // 设定特殊数字,这里以17为例
    private readonly int _specialNum = 17;
    // 存储当前可用的普通数字(排除特殊数字)
    private List<int> _availableNums = new List<int>();
    // 暂存已使用的普通数字,用于一轮选完后重置
    private List<int> _usedNums = new List<int>();
    // 标记特殊数字是否可被选取
    private bool _canPickSpecial = true;
    private System.Random _random = new System.Random();

    void Start()
    {
        // 初始化普通数字池:0-29除了17
        for (int i = 0; i < 30; i++)
        {
            if (i != _specialNum)
                _availableNums.Add(i);
        }
    }

    // 获取下一个符合规则的随机数
    public int GetNextNumber()
    {
        int selected = -1;

        // 满足条件时随机选择特殊数字
        if (_canPickSpecial && _availableNums.Count > 0 && _random.Next(2) == 0)
        {
            selected = _specialNum;
            // 选完特殊数字后,需等普通数字一轮选完才能再选
            _canPickSpecial = false;
        }
        else
        {
            // 从可用普通数字中随机选一个
            int randIndex = _random.Next(_availableNums.Count);
            selected = _availableNums[randIndex];
            
            // 移到已使用列表
            _usedNums.Add(selected);
            _availableNums.RemoveAt(randIndex);

            // 普通数字一轮选完,重置可用池并允许再次选特殊数字
            if (_availableNums.Count == 0)
            {
                _availableNums.AddRange(_usedNums);
                _usedNums.Clear();
                _canPickSpecial = true;
            }
        }

        return selected;
    }

    // 测试:按空格获取随机数并打印
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Debug.Log("选中数字:" + GetNextNumber());
        }
    }
}

代码说明

  • 用List替代数组管理数字,避免初始化和遍历的错误,逻辑更清晰。
  • 特殊数字17被选中后,会锁定到普通数字全部选完一轮(可用池重置),才允许再次被选取。
  • 随机数范围根据可用数字数量动态调整,不会出现漏选或误判的情况。
  • 去掉了原代码中无意义的循环变量,从根源上避免无限循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:52:49