使Random.range不重复值

时间:2018-01-02 13:33:53

标签: 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...) 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
    }


}

谢谢!

2 个答案:

答案 0 :(得分:5)

怎么样

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
    }
}

答案 1 :(得分:2)

您的原始陈述从3个可能的数字中选择1个(1,2,3)。

j = Random.Range(1, 4);

如果您想避免上次发出的号码,那么只留下2个可能的号码。

Random.Range(1, 3)

将此随机数添加到先前的j值会产生一个同样随机的新值,但保证与之前的j值不同。

j = j + Random.Range(1, 3);

当然,你需要包装值以使它们保持在所需的范围内{1,2,3}:

if (j > 3) j -= 3;

或者,使用modulo(%)使其成为单行:

j = 1 + (j + Random.Range(0, 2)) % 3;

同样适用于更大的范围。

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

这种方法比复制时的循环效率更高。'迭代次数没有保证限制。