C# 使Random.range不重复值
我必须生成不同的对象,关键是没有两个对象重复。我的意思是,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..
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);