【问题标题】:Consistent random number based on position (not noise based)基于位置的一致随机数(不基于噪声)
【发布时间】:2018-09-21 13:47:06
【问题描述】:

我正在寻找一种在特定地图坐标处的两个范围之间选择随机数的好方法,该随机数总是基于该坐标返回相同的数字。

在上下文中,我有一个地图生成器,它使用 perlin 噪声来构建它,放置水、草、岩石等,效果很好,但是每个图块都可以有替代纹理,例如,草图块可能有 5 个替代纹理它可以使用。我希望能够完全随机地生成其中一个,但它需要在每次播放时保持一致,并且不使用 perlin 噪声,因为这通常会产生流动(一个纹理的几个,然后是下一个纹理的几个等)

值得注意的是,我不能只为此设置一个随机种子,因为世界的那一部分可以随时生成,而不是按特定顺序。

我尝试了类似以下的方法:

public static int PerlinNoiseCalcInt(float x, float y, float size, float power, int min, int max) {
        int f = Mathf.RoundToInt(Mathf.PerlinNoise(x / size * power, y / size * power) * max + min);
        return f < max ? f : max--;
    }

这种作品,但正如您可能期望的那样,它给出了一堆一个纹理,然后是一堆另一个,我真的希望它看起来非常随机,但每次在那个地图位置每次都一样.

【问题讨论】:

  • 您是否尝试过根据地图坐标设计一个独特的种子?相同坐标具有相同种子应该始终产生相同的伪随机结果。
  • 你也可以看看椭圆曲线之类的东西吗?我不确定这是否可行,因此不是答案。
  • 我不能使用 Unity 的 Random.seed,因为它是在线程上运行的,是否有替代方案?每次初始化 System.Random 都相当费力。

标签: c# unity3d


【解决方案1】:

当您说“一致”时,您的意思是“确定性”吗?

有很多方法可以做到这一点。您可以只使用任何随机数函数,其中参数是坐标的某种组合。

例如:

public int GetTileInt(int x, int y, int seed, int numberOfOptions)
{
     return SomeRandomFunction(x^2*y + 2*y^2*x + seed)%numberOfOptions;
}

这将为坐标和种子的每个组合生成一个唯一值,但每次都相同。你也可以研究散列的东西,但这不是我的风格。

另一种选择是只对每个图块应用一个随机整数,而不考虑任何坐标。然后对于每个图块,纹理索引将是可能的纹理数量的模数,然后只需在该索引处分配纹理。

【讨论】:

    【解决方案2】:

    我不确定我是否正确理解了您要查找的内容,但是您是否尝试过查看 Voronoi Diagrams ?算法是这样的:

    • 获取一组称为种子或生成器的随机点,并为它们应用随机纹理(拥有的种子越多,获得的区域就越多)
    • 对于每个其他点,找到最近的种子并对其应用相同的纹理

    如果您只跟踪种子,您将能够每次都以相同的外观再生。如果您想更频繁地生成一种纹理,也可以使用概率。

    【讨论】:

      【解决方案3】:

      值得注意的是,我不能只为此设置一个随机种子,因为世界的那一部分可以随时生成,而不是按特定顺序。

      为每个坐标创建一个新的 System.Random,使用坐标哈希作为种子。

      // this would be your coordinate
      var coord = Vector3.one;
      
      var rng = new System.Random(coord.GetHashCode());
      
      // the below will always be the same (as long as coord doesn't change)
      var rand1 = rng.Next();
      var rand2 = rng.Next();
      var rand3 = rng.Next();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-06
        • 1970-01-01
        • 1970-01-01
        • 2019-11-29
        • 1970-01-01
        相关资源
        最近更新 更多