Mathf.PerlinNoise() 是否依赖于内部随机数生成器?

does Mathf.PerlinNoise() rely on the internal random number generator?

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

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

最小代码示例:

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

我想将其用于类似 Minecraft 的生成程序游戏世界的系统,并为玩家提供一种选择种子的方法,这会很棒。在该代码示例中,玩家选择的种子是电视节目“迷失”中的号码。 (4815162342)

两者相关!

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

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


Mathf.PerlinNoise 与此无关。实际上,您可以尝试不同的种子并始终看到相同的 perlin 结果。这实际上在 API

The same coordinates will always return the same sample value but the plane is essentially infinite so it is easy to avoid repetition by choosing a random area to sample from.

他们已经为您提供了解决问题的提示:使用不同的偏移量!

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

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);