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



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

我的理想是具有与上述Mathf.PerlinNoise函数完全相同的输入和输出。关键是,它可以用Perlin Noise函数切换出来,以返回完全随机的浮点值,这些浮点值每次都会为任何给定的坐标返回相同的浮点值。

所以你的问题由两个问题组成:

  1. 从两个float值创建一个种子,该值始终将相同的输入映射到相同的种子。

  2. 使用种子生成随机CCD_ 5。

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

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类不支持的float。如果double对你来说足够好(PerlinNoise的浮点可以转换为double的(,那么你可以这样做:

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

如果double不够好,并且您要求它是float,我将参考这个答案,他的所有解决方案都应该与使用上面的哈希函数作为种子创建的Random实例一起使用。

希望这对你的项目有所帮助并祝你好运!

最新更新