这个问题在这里已有答案:
我必须产生不同的对象,重要的是没有两个对象重复。我的意思是,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个(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);
这种方法比“复制时循环”更有效;迭代次数没有保证限制。