C# 使用坐标作为种子的随机浮点
C# 使用坐标作为种子的随机浮点,c#,unity3d,random,random-seed,perlin-noise,C#,Unity3d,Random,Random Seed,Perlin Noise,Mathf.PerlinNoise(float x,float y)函数返回我使用的float。我想要一个更完全的随机函数,可以使用坐标作为种子 我的理想情况是拥有与前面提到的Mathf.PerlinNoise函数完全相同的输入和输出。 问题的关键是,可以使用柏林噪声函数将其关闭,以返回完全随机的浮点值,这些浮点值每次都为任何给定坐标返回相同的浮点值。因此,您的问题由两个问题组成: 从始终将相同输入映射到同一种子的2float值创建种子 使用种子生成随机的浮点 对于第一个问题,这可以通过创建
Mathf.PerlinNoise(float x,float y)
函数返回我使用的float
。我想要一个更完全的随机函数,可以使用坐标作为种子
我的理想情况是拥有与前面提到的Mathf.PerlinNoise
函数完全相同的输入和输出。
问题的关键是,可以使用柏林噪声函数将其关闭,以返回完全随机的浮点值,这些浮点值每次都为任何给定坐标返回相同的浮点值。因此,您的问题由两个问题组成:
float
值创建种子
浮点
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
类不支持的浮点。如果double
对您来说已经足够好了(从PerlinNoise
中浮点数可以转换为double
),您可以执行以下操作:
public double GenerateRandom(float x, float y)
{
return new Random(GetHashCode(x, y)).NextDouble();
}
如果double
不够好,您要求它是float
,我将提到,他的所有解决方案都应该与使用上面的哈希函数作为种子创建的Random
实例一起工作
希望这对你的项目有帮助,祝你好运 这个代码有多快?似乎创建一个
Random
实例会有点贵,特别是如果你像我一样每秒执行数百次。@Xevion首先我没有提到的是NextDouble
生成一个介于0和1之间的值,因此,请记住,您必须将其缩放到所需的任何范围,或者如果您想要完整的浮动范围,请使用引用的答案来获得该值。@Xevion至于速度。首先,在计算机科学中,“每秒数百次”并不多。创建这些Random
实例肯定会有一个固定的成本,您可以通过使用散列生成Randomfloat
来避免这一成本,但这可能不会更有效率。好的随机性是相当复杂的。我已经运行了一个基准测试,在我的电脑上使用GenerateRandom
生成1000点的随机double
。所以我应该能够每秒完成500000代是的,我将每秒完成100次以上。看看2毫秒的计时,这真的很慢,只有1000分。我希望在最大5毫秒时获得1024^2点(我知道我在做梦)。@Xevion是的,有了这些数量,你需要进行其他优化(并行处理),但我不认为通过另一种方式你会获得很多好处。或者您必须使用不同的散列方法来确保散列是一致随机的,然后找到一种直接从该散列生成随机浮点的方法,但我的假设是,这不会在计算时间上产生巨大的差异(散列也非常昂贵)。无论如何,你的问题包含的信息非常有限,所以不可能说得更多。