C# 使Random.range不重复值

C# 使Random.range不重复值,c#,unity3d,C#,Unity3d,我必须生成不同的对象,关键是没有两个对象重复。我的意思是,random.range不应该同时获得两个相同的数字,否则代码有时会生成相同的对象。这里有一个更简单的代码来帮助您理解我正在尝试的内容 void Update () { j = Random.Range (1, 4); // this should give j values like=(1,2,1,3,2,1) // and not this = (1,1,2,2..

我必须生成不同的对象,关键是没有两个对象重复。我的意思是,random.range不应该同时获得两个相同的数字,否则代码有时会生成相同的对象。这里有一个更简单的代码来帮助您理解我正在尝试的内容

void Update () {

    j = Random.Range (1, 4); // this should give j values like=(1,2,1,3,2,1)
                              // and not this = (1,1,2,2...) the numbers should not repeat simultaneously.

    Inst();
}

void Inst(){

    if (j == 1) {

        //instantiate obj1
    }
    else if (j == 2) {

        instantiate obj2
    }

    else if (j == 3) {

        instantiate obj3
    }


}
谢谢大家!

怎么样

int lastValue;
public int UniqueRandomInt(int min, int max)
{
    int val = Random.Range(min, max);
    while(lastValue == val)
    {
        val = Random.Range(min, max);
    }
    lastValue = val;
    return val;
}

void Update() 
{
    UniqueRandomInt(1, 4);
    Inst();
}

void Inst()
{
    if (lastValue == 1)
    {
        //instantiate obj1
    }
    else if (lastValue == 2)
    {
        //instantiate obj2
    }
    else if (lastValue == 3)
    {
        //instantiate obj3
    }
}

您的原始语句从3个可能的数字(1、2、3)中选择1

如果要避免使用上一次发布的数字,则只剩下2个可能的数字

Random.Range(1, 3)
将此随机数添加到
j
的上一个值会产生一个同样随机的新值,但保证与
j
的上一个值不同

j = j + Random.Range(1, 3);
当然,您需要包装值以将其保持在所需的范围{1,2,3}内:

if (j > 3) j -= 3;
或者,使用模(
%
)将其设置为一行:

j = 1 + (j + Random.Range(0, 2)) % 3;
同样适用于更大范围

j = min + (j - min + Random.Range(1, max - min)) % (max - min);

这种方法比“重复时循环”更有效;迭代次数没有保证的限制。

跟踪上一个值,不要让它在下一个goIt上生成该值。看起来你正在搜索我应该如何做?每次使用if?使用递归进行比较。每次生成随机数时,将其添加到列表中。如果list.Contains()包含您的随机数,则递归您的函数,直到生成一个新的、唯一的数字。注意在接受的答案中使用
循环来执行此操作。请参阅“复制”,了解如何在不使用while循环的情况下执行此操作。对于大型列表,这将变得很慢。@Wouter:意识到了这一点。更新的答案。交替序列有效吗?好的,当我使用这个变量时,我应该在spawn函数中使用哪个变量来比较它?我不知道为什么它有这么多的向上投票。这会导致很多严重的问题,比如游戏冻结甚至锁定。不要使用随机数来控制
while
循环,除非您在一个协程函数中等待一些帧。
j = min + (j - min + Random.Range(1, max - min)) % (max - min);