Mathf.PerlinNoise(float x, float y)
函数返回我使用的float
。我想要一个更完全随机的函数,可以使用坐标作为种子。
我的理想是具有与上述Mathf.PerlinNoise
函数完全相同的输入和输出。关键是,它可以用Perlin Noise函数切换出来,以返回完全随机的浮点值,这些浮点值每次都会为任何给定的坐标返回相同的浮点值。
所以你的问题由两个问题组成:
-
从两个
float
值创建一个种子,该值始终将相同的输入映射到相同的种子。 -
使用种子生成随机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
实例一起使用。
希望这对你的项目有所帮助并祝你好运!