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
函数完全相同的输入和输出。
问题的关键是,可以使用柏林噪声函数将其关闭,以返回完全随机的浮点值,这些浮点值每次都为任何给定坐标返回相同的浮点值。

因此,您的问题由两个问题组成:

  • 从始终将相同输入映射到同一种子的2
    float
    值创建种子

  • 使用种子生成随机的
    浮点

  • 对于第一个问题,这可以通过创建哈希代码来解决,有不同的方法来解决,但我将参考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
    类不支持的浮点。如果
    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
    实例肯定会有一个固定的成本,您可以通过使用散列生成Random
    float
    来避免这一成本,但这可能不会更有效率。好的随机性是相当复杂的。我已经运行了一个基准测试,在我的电脑上使用
    GenerateRandom
    生成1000点的随机
    double
    。所以我应该能够每秒完成500000代是的,我将每秒完成100次以上。看看2毫秒的计时,这真的很慢,只有1000分。我希望在最大5毫秒时获得1024^2点(我知道我在做梦)。@Xevion是的,有了这些数量,你需要进行其他优化(并行处理),但我不认为通过另一种方式你会获得很多好处。或者您必须使用不同的散列方法来确保散列是一致随机的,然后找到一种直接从该散列生成随机浮点的方法,但我的假设是,这不会在计算时间上产生巨大的差异(散列也非常昂贵)。无论如何,你的问题包含的信息非常有限,所以不可能说得更多。