【问题标题】:How to avoid Unity Random.Range function to generate same numbers?如何避免 Unity Random.Range 函数生成相同的数字?
【发布时间】:2021-11-16 10:39:44
【问题描述】:

我有一种方法可以在每次调用该方法时以某个(随机)角度生成游戏对象。 有时会发生两个GameObject以相同的随机角度通过该方法生成,它们重叠。

我需要避免这种情况,但我不知道该怎么做。

这里是方法的代码:

public Branch CreateBranch()
{
    GameObject newBranchGo = new GameObject("Branch");
    newBranchGo.transform.position = transform.position;
    newBranchGo.transform.parent = transform;

    newBranchGo.transform.rotation = transform.rotation;

    var angle = tree.GoldenAngle;
    if (tree.NumChildren == 1)
    {
        angle = 0;
        //Debug.Log("Angle: " + angle);
        newBranchGo.transform.Rotate(angle, 0f, 0f, Space.Self);
    }
    else
    {
        if (Random.Range(0f, 1f) < 0.8f)
        {
            angle = -angle;
        }

        if (Random.Range(0f, 1f) < 0.5f)
        {
            newBranchGo.transform.Rotate(angle, 0f, 0f, Space.Self);
        }
        else
        {
            newBranchGo.transform.Rotate(0f, angle, 0f, Space.Self);
        }
    }

    Branch branch = newBranchGo.AddComponent<Branch>();
    branch.BranchInit(tree, GetComponent<Bud>());

    return branch;
}

【问题讨论】:

  • 我没有看到你的随机性编码在哪里,但你可以将最后一个角度存储在变量中的某处,在返回分支之前,你可以检查生成的数字是否相同。
  • 这里:else { if (Random.Range(0f, 1f)
  • 在您的代码中,只有 2 个角度可能(如果 tree.NumChildren != 1):父级 angleGameObjectangle * -1 的实际 angle 。这是您想要的吗?
  • var angle = tree.GoldenAngle; 中的tree.GoldenAngle; 实际上是一个硬编码值:在开始时设置,例如public float GoldenAngle = 30f; 该方法每次旋转随机“角度”时都会生成Branch GameObject,但有时会发生这种情况两个连续的方法调用生成相同的随机“角度”,重叠两个新的分支游戏对象
  • Sometimes it happens .. 是的,这是一个随机值,所以确实可能会发生两次类似的值

标签: c# unity3d random


【解决方案1】:

一个简单的方法是rejection-sampling。只需取您的随机值,进行一些检查,如果检查失败,则生成一个新值。在这种情况下,我会假设检查对象是否重叠或值是否接近之前的值。

【讨论】:

  • 谢谢,但是怎么做?
【解决方案2】:

您可以在 Unity 中更改随机数生成器的起始种子,以便每次最新种子在范围内生成不同的随机数时:

    Random.InitState(DateTime.UtcNow.Millisecond);
    float NonRepeatedResult = Random.Range(0f, 1f);
    if(NonRepeatedResult < 0.8f)
    {
        //Do your stuff
    }
    ......

这里的当前毫秒每次都在快速变化,每次随机数生成都会改变种子,这会在连续几代中增加唯一性元素。

【讨论】:

  • 它仍然可以生成相同的角度。
猜你喜欢
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
相关资源
最近更新 更多