使用坐标作为种子的随机浮点数

Random float using coordinate as seed

Mathf.PerlinNoise(float x, float y) 函数 return 是我使用的 float。我想要一个可以使用坐标作为种子的更完全随机的函数。

我的理想是与前面提到的 Mathf.PerlinNoise 函数具有完全相同的输入和输出,. 关键是它可以用 Perlin Noise 函数切换到 return 完全随机的浮点数,即 return 每次给定坐标的相同浮点数。

所以你的问题包含两个问题:

  1. 从始终将相同输入映射到相同种子的 2 float 值创建种子。

  2. 使用种子生成随机 float

对于第一个问题,这可以通过创建哈希码来解决,有不同的方法可以解决,但我将参考 John Skeet 的 this answer 以获取更多信息。对你来说,散列看起来像这样:

public int GetHashCode(float x, float y)
{
    unchecked // Overflow is fine, just wrap
    {
        int hash = (int)2166136261;
        // Suitable nullity checks etc, of course :)
        hash = (hash * 16777619) ^ x.GetHashCode();
        hash = (hash * 16777619) ^ y.GetHashCode();
        return hash;
    }
}

现在问题 1 已解决,我们可以继续解决问题 2,这里我们遇到了一个问题,因为您需要 Random class 不支持的浮点数。如果 double 对你来说足够好(你的 PerlinNoise 的浮点数可以转换为 double 的),你可以这样做:

public double GenerateRandom(float x, float y)
{
    return new Random(GetHashCode(x, y)).NextDouble();
}

如果double不够好,你要求它是float,我会参考this answer,他的所有解决方案都应该使用Random ] 使用上面的哈希函数作为种子创建的实例。

希望这对您有所帮助,祝您项目顺利!