Unity中使用UnityEngine.Random生成不重复随机数出现无限循环问题
随机生成9个不重复数字时无限循环的原因分析
你的代码陷入无限循环的核心问题出在Unity随机数方法的区间特性上:
Unity的
Random.Range(int min, int max)是左闭右开区间,你写的Random.Range(1,9)只会生成1到8的整数(包含1,不包含9)。但你需要生成1-9共9个不重复数字,当数组填满1-8后,后续永远生成不了9,代码会一直进入else分支执行j--,内层for循环无法正常推进,最终卡死在无限循环里。你朋友的复刻代码能正常运行,是因为他用的是标准C#的
Random.Next(int minValue, int maxValue)——这个方法是左闭右闭区间,如果他写的是Next(1,10),就能覆盖1-9的所有数字,自然不会出现无限循环的情况。
补充优化建议
你的代码靠重复随机碰运气去重的逻辑效率偏低,当数组接近填满时,重复碰撞的概率会急剧上升。推荐改用洗牌算法,比如先把1-9存入列表,打乱顺序后再填充数组,示例逻辑如下:
public void randomizer() { resetArray(); List<int> nums = new List<int>{1,2,3,4,5,6,7,8,9}; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { int randomIdx = UnityEngine.Random.Range(0, nums.Count); buttons[i,j] = nums[randomIdx]; nums.RemoveAt(randomIdx); } } }
内容的提问来源于stack exchange,提问作者OtakuDragon53
相关产品推荐
相关产品推荐

