使用坐标作为种子的随机浮点数
Random float using coordinate as seed
Mathf.PerlinNoise(float x, float y)
函数 return 是我使用的 float
。我想要一个可以使用坐标作为种子的更完全随机的函数。
我的理想是与前面提到的 Mathf.PerlinNoise
函数具有完全相同的输入和输出,.
关键是它可以用 Perlin Noise 函数切换到 return 完全随机的浮点数,即 return 每次给定坐标的相同浮点数。
所以你的问题包含两个问题:
从始终将相同输入映射到相同种子的 2 float
值创建种子。
使用种子生成随机 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
] 使用上面的哈希函数作为种子创建的实例。
希望这对您有所帮助,祝您项目顺利!
Mathf.PerlinNoise(float x, float y)
函数 return 是我使用的 float
。我想要一个可以使用坐标作为种子的更完全随机的函数。
我的理想是与前面提到的 Mathf.PerlinNoise
函数具有完全相同的输入和输出,.
关键是它可以用 Perlin Noise 函数切换到 return 完全随机的浮点数,即 return 每次给定坐标的相同浮点数。
所以你的问题包含两个问题:
从始终将相同输入映射到相同种子的 2
float
值创建种子。使用种子生成随机
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
] 使用上面的哈希函数作为种子创建的实例。
希望这对您有所帮助,祝您项目顺利!