【问题标题】:does Mathf.PerlinNoise() rely on the internal random number generator?Mathf.PerlinNoise() 是否依赖内部随机数生成器?
【发布时间】:2020-11-06 10:09:38
【问题描述】:

我正在使用 Unity c#,并且我正在编写一些依赖于 Perlin 噪声来确定 0 到 1 之间的随机数的代码。我想在我的代码中实现一个功能,允许用户定义一个特定的预先确定的用于此的种子编号,但我不确定 Perlin 噪声函数是否实际上使用与 Random 类相同的随机种子。

例如;如果我想使用 Mathf.PerlinNoise() 生成 Perlin 噪声 - 如果我总是使用相同的数字设置 RNG 种子修道院,它是否总是相同的?

最小代码示例:

Random.InitState(4815162342);
    float _randomSample = Mathf.PerlinNoise(yada yada yada);

我想将它用于类似于 Minecraft 的系统来生成程序游戏世界并让玩家选择种子的方式会很棒。在该代码示例中,玩家选择的种子是电视节目“Lost”中的数字。 (4815162342)

【问题讨论】:

  • 如果我总是使用相同的数字设置 RNG 种子修道院,它是否总是一样的? - 当你尝试这样做时发生了什么?

标签: c# unity3d random perlin-noise


【解决方案1】:

两者相关!

Random.InitState 唯一改变的是方式,例如Random.RangeRandom.value 工作。

如果不使用它,它只会使用基于系统时间的值。


Mathf.PerlinNoise 没有连接到那个。您实际上可以尝试不同的种子并始终看到相同的 perlin 结果。这其实是在API

相同的坐标将始终返回相同的采样值,但平面本质上是无限的,因此通过选择随机区域进行采样很容易避免重复。

他们已经给你提示了如何解决你的问题:使用不同的偏移量!

现在你的种子开始发挥作用了:只需根据种子选择一个随机偏移量 -> 随机但对于同一个种子总是相等的!

Random.InitState(4815162342);
var randomOffsetX = Random.value;
var rabdomOffsetY = Random.value;

var values = new float[25];
for(var x = 0; x < 5; x++)
{
    for(var y = 0; y < 5; y++) 
    {
        values[x*5 + y] = Mathf.PerlinNoise(x + randomOffsetX, y + randomOffsetY);
    }
}

这应该为您提供 25 个随机值(介于 0 和 1 之间)。但是每次使用相同的种子时它们应该是相等的。


如果您实际上不需要噪声模式而只需要一个值,则基本上您只需使用即可实现相同的目标

Random.InitState(4815162342);
var value = Random.Range(0f, 1f);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 2023-01-03
    • 1970-01-01
    相关资源
    最近更新 更多