【问题标题】:Make Random.range not repeat values [duplicate]使 Random.range 不重复值 [重复]
【发布时间】:2018-01-02 13:33:52
【问题描述】:

我必须生成不同的对象,重要的是不要重复两个对象。我的意思是,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
    }


}

谢谢!

【问题讨论】:

  • 跟踪前一个值,不要让它在下一次生成该值
  • 您正在搜索shuffle
  • 我应该怎么做?每次使用 if 进行比较?
  • 使用递归。每次生成随机数时,将其添加到 List。如果 theList.Contains() 你的随机数,递归你的函数,直到产生一个新的、唯一的数字。
  • 谨防在接受的答案中使用while 循环来执行此操作。请参阅副本了解如何在没有 while 循环的情况下执行此操作。

标签: c# unity3d


【解决方案1】:

怎么样

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

【讨论】:

  • 这对于大型列表会变慢。
  • @Wouter:意识到这一点。更新了答案。
  • 交替序列是否有效?
  • 好的,当我使用这个时,我应该在 spawn 函数中使用哪个变量来比较它?
  • 我不知道为什么会有这么多赞成票。它可能导致许多严重的问题,因此此类游戏冻结甚至锁定。不要使用随机数来控制while 循环,除非您在协程函数中并且等待一些帧。
【解决方案2】:

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

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;

或者,使用模 (%) 使其成为单线:

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

同样适用于更大的范围。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多