如何让Random.Range不生成连续重复数值以避免重复生成对象
嘿,这个问题我之前做项目时也碰到过!连续生成相同的随机数确实会导致反复实例化同一个对象,体验感很差。咱们来调整代码解决这个问题:
解决连续重复随机数导致的对象重复实例化问题
核心思路就是记录上一次生成的随机数,每次生成新值时避开它。具体实现步骤如下:
- 在类中添加一个成员变量,用来存储上一次的随机结果:
private int lastGeneratedJ = -1; // 初始值设为1-3以外的数,确保第一次生成不会冲突
- 修改
Update方法里的随机数生成逻辑,循环生成直到拿到和上一次不同的值:
void Update () { int newJ; do { newJ = Random.Range(1, 4); } while (newJ == lastGeneratedJ); // 只要和上一次重复就重新生成 j = newJ; lastGeneratedJ = j; // 更新上一次的记录 Inst(); }
- 原有的
Inst方法可以保持不变,现在每次调用它时,j的值都不会和上一次重复,自然就不会连续实例化同一个对象了:
void Inst(){ if (j == 1) { // Instantiate obj1 } else if (j == 2) { Instantiate(obj2); } else if (j == 3) { Instantiate(obj3); } }
额外优化小技巧
如果后续你的随机数值范围变大,这种循环生成的方式效率依然没问题(毕竟重复的概率很低)。要是想更直接,也可以从排除上一次值的集合里直接挑选:
// 以1-3为例,先移除上一次的数值,再从剩余值里随机选 List<int> availableNumbers = new List<int>{1,2,3}; availableNumbers.Remove(lastGeneratedJ); j = availableNumbers[Random.Range(0, availableNumbers.Count)]; lastGeneratedJ = j;
这种方式不用循环,直接从可用值里挑,适合数值范围较大的场景。
这样调整后,生成的序列就会像你期望的(1,2,1,3,2,1)一样,再也不会出现连续重复的情况啦!
内容的提问来源于stack exchange,提问作者Vivek Negi
相关产品推荐
相关产品推荐

