【问题标题】:Random.Range not changing its outcome each time its called, why?Random.Range 每次调用时都不会改变其结果,为什么?
【发布时间】:2017-08-03 09:36:27
【问题描述】:

我正在使用随机范围来选择要生成的敌人类型。

IEnumerator Spawn()
    {
        int randAmount = UnityEngine.Random.Range(minAmount, maxAmount); // Determine quantity of enemies to be spawned
        int randType = UnityEngine.Random.Range(0, 1); // Determine which enemy is spawned
        enemies[randType](randAmount); // Call enemy type, then amount
        yield return new WaitForSeconds(spawnRate);
        StartCoroutine(Spawn()); // Loop
    }

当使用调试器附加到统一时,我可以看到每次调用协程时randAmountchanges,但是randType并没有从0改变,我一直在测试一遍又一遍,我开始思考这不再是厄运。

我知道第一个变量工作正常,是否有确保第二个变量正常工作,或者每次调用协程时获取 0 到 1 之间的随机数的替代方法。

【问题讨论】:

  • static function Range (min : int, max : int) : int 描述返回一个介于 min [inclusive] 和 max [exclusive] 之间的随机整数(只读)。
  • @OmBiEaTer,我认为他们没有计算上限,所以你必须去 +1
  • Random.Range(0, 2)
  • 不是骗子——它是 Unity API,而不是 MS C# API。

标签: c# unity3d random delegates


【解决方案1】:

Unity 的Random.Range 第二个参数是独占的,这意味着Unity 不包含它。它包括 max-1。

如果要生成01 之间的随机数,则必须将2 传递给第二个参数。那应该是Random.Range(0, 2)

【讨论】:

  • @EpicKip 我不回答重复的问题。我关闭所有重复项。 这不是重复的。您提供的链接与此不重复。 1. OP 使用的是Random.Range 而不是Random.Next。 2.Unity中生成随机数与使用C#标准API生成随机数不同。请注意我在此答案中链接的 API。
  • 我真的不知道为什么我在问之前没有开始搜索这个问题,对不起。
【解决方案2】:

根据 Unity 手册:

public static float Range(float min, float max);

说明 返回介于 min [inclusive] 和 max [inclusive] 之间的随机浮点数(只读)。 请注意,max 包含,因此使用 Random.Range(0.0f, 1.0f) 可能会返回 1.0 作为值。

但是

public static int Range(int min, int max);

说明 返回 min [inclusive] 和 max [exclusive] 之间的随机整数(只读)。 请注意,max 是独占,因此使用 Random.Range(0, 10) 将返回 0 到 9 之间的值。如果 max 等于 min,则将返回 min。

所以解决方案是从 (0,1) 变为 (0,2)。

【讨论】:

    猜你喜欢
    • 2016-06-02
    • 2021-09-16
    • 2022-06-27
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    相关资源
    最近更新 更多