【问题标题】:Is there an algorithm or function that outputs a random number given n number values? [closed]是否有一种算法或函数可以在给定 n 个数值的情况下输出随机数? [关闭]
【发布时间】:2021-06-27 11:35:13
【问题描述】:

所以我一直在开发一款利用程序地形和结构生成的游戏。现在,我正在处理结构生成问题——我使用了 Poisson-Disc 采样,我计划在我的世界中实现它。但是,我的采样依赖于一个单一的种子。有没有办法接受 3 个或更多数字来输出与这些数字有某种关联的随机数?

另一方面,随机数不必在输入的可能范围内。

如果不可能,是否有任何其他范例可以在无限程序生成的世界上实施泊松圆盘采样(或其替代方案)以创建结构?我有点卡住了。

例子:

Random x = new Random(138013, 28282, 37920)
x.nextInt() = 38309
Random y = new Random(138012, 28282, 37920)
y.nextInt() = 28323
Random z = new Random(138013, 28282, 37920)
z.nextInt() = 38309
//new Random(a,b,c).nextInt() does not have to be within ranges [a,b], [a,c], [b,c]

【问题讨论】:

  • 完全不清楚您在这里寻找什么。如果您打算使用 Java 的内置 PRNG,则状态为 48 位。您所做的任何播种都将被折叠为 48 位,因此向堆中添加更多数字不会获得任何好处,因为它们只需折叠为 2^48 状态之一。如果您使用第三方生成器,例如 MT19937 或 WELL,它使用更大的状态,可以相应地播种。如果您打算创建自己的 PRNG,请不要 - 无论您认为创建一个好的 PRNG 有多难,我保证它比这更难。
  • 请注意,nextInt() 永远不应位于赋值表达式的左侧。

标签: java random noise poisson procedural-generation


【解决方案1】:

您可以通过连接这三个值来创建种子:

new Random(138013, 28282, 37920) => new Random("138013" + "28282" + "37920")

这不是有效的代码,但我希望你能明白其中的原理。然后应将字符串转换为长字符串。如果这个数字太长了,也许你可以应用一个特定的模数。像138013 % 10000 一样,对每个值都这样做。或者您可以将这三个值相加。

【讨论】:

  • 对于java.util.Random,任何超过 48 位的内容都是浪费的。
  • 我真的不懂java,@SamMason 在这里有更好的答案。
  • 鉴于 OP 试图完成的任务模棱两可,我不相信有任何好的答案。
  • 我认为他的位置由 x,y,z 定义,并且他想使用随机值确定是否应该存在某物,该随机值由 x,y,z 播种。但这只是一个疯狂的猜测。
  • 也许,但如果您需要对作者的意图做出疯狂的猜测,那么尝试回答这个问题还为时过早。此外,对我来说,这个问题听起来像是 OP 有一个(常见的)误解,即 PRNG 的结果质量是播种的函数。它不是。质量由所使用的算法决定。播种通过确定 PRNG 循环的入口点来控制可重复性。
【解决方案2】:

使用某些值的加密哈希通常会导致结果的确定性降低。在您的情况下,类似于:

    public Random fromCoords(long x, long y, long z) throws Exception {
        var buf = ByteBuffer.allocate(4 * 8);

        buf.putLong(world_seed);
        buf.putLong(x);
        buf.putLong(y);
        buf.putLong(z);

        buf.flip();

        var md = MessageDigest.getInstance("SHA-256");
        md.update(buf);

        var seed = ByteBuffer.wrap(md.digest()).getLong();

        return new Random(seed);
    }

可能就足够了,但不是特别有效。如果这是一个问题,您可以使用一些旋转来代替 ByteBuffer 来避免大多数不必要的堆分配。

【讨论】:

    猜你喜欢
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多