【问题标题】:Pseudo random number generator from two inputs来自两个输入的伪随机数生成器
【发布时间】:2011-09-22 03:14:10
【问题描述】:

我需要一个伪随机数生成器,它可以从两个浮点类型的输入中为我提供一个范围为 [-1, 1](范围是可选)的数字。

我也会尝试解释我为什么需要它:

我正在使用Diamond-Square algorithm 为我的地形引擎创建高度图。地形被分割成块(Chunked LOD)。

Diamond-Square 的问题在于它使用随机函数,所以假设两个相邻块共享同一个点 (x, z),那么我希望它们的高度都相同,这样我就不会获得一些裂纹效果。

有人可能会说我可以从邻居补丁中获取高度信息,但是在首先创建补丁之后结果可能会有所不同。

这就是为什么我需要一个伪数生成器,它在给定两个输入(x,z)的情况下返回一个唯一数字。

(我不是要求某人编写这样的函数,我只需要一般反馈和/或执行类似操作的已知算法)。

【问题讨论】:

  • 我不太明白这个问题。您如何定义基于两个数字的随机数?如果它是随机的,那就是随机的,唯一需要担心的因素是种子和分布。如果这是您的目标,种子可以是这两个输入数字的任意组合。但结果仍然是完全随机的。请说明您对尝试生成的数字的期望。
  • 这很好,但有两件事:第一,我们不会为您编写代码,第二 - 即使我们需要知道您使用的是什么语言。
  • 它不应该是随机的,我只是说 Diamond-Square 得到一个随机数。我要求给定 x、z 的唯一数字,或者换句话说,给定两个输入的某个伪数生成器。这个问题上的随机标签相当混乱,我应该删除它。我不是要求任何人为我编写函数,但我很想得到一些反馈、方向或已知的算法。谢谢!

标签: algorithm math random terrain level-of-detail


【解决方案1】:

如果您正在寻找来自 IRxIR -> [-1;1] 的双射,我可以建议:

从 IR 到 ]-a:a[

的双射

首先让我们从 IR-> ]-1;1[ 中找到一个双射,所以我们只需要从 IRxIR->IR 中找到一个双射

tan(x): ]-Pi/2;Pi/2[ -> IR

arctan(x) : IR -> ]-Pi/2;Pi/2[

1/Pi*arctan(x) + 1/2: IR -> ]0;1[

2*arctan(x) : IR->]-Pi:Pi[

和

ln(x) : IR + -> IR

exp(x): IR -> R+

双射来自]0,1[ x ]0,1[ -> ]0,1[

让我们写:

(x,y) in ]0,1[ x ]0,1[

x= 0,x1x2x3x4...xn...etc  where x1x2x3x4...xn represent the decimals of x in base 10

y=0,y1y2y3y4...ym...etc  idem

Let's define z=0,x1y1x2y2xx3y3....xnyn...Oym  in ]0,1[ 

然后通过构造我们可以证明它是从]0,1[ x ]0,1[到]0,1[的精确双射。 (我不确定 zith 无限小数是否是真的..但它至少是一个“非常好的”注入,如果我错了,请告诉我)

让我们将这个函数命名为:CANTOR(x,y)

那么 2*CANTOR-1 是来自 ]0,1[ x ]0,1[ -> ]-1,1[ 的双射

然后结合以上所有断言:

你去,你从 IRxIR 得到双射 -> ]-1;1[...

您可以与来自 IR-> ]0,1[ 的双射相结合

IRxIR -> ]-1;1[
(x,y) ->  2*CANTOR(1/Pi*arctan(x) + 1/2,1/Pi*arctan(y) + 1/2)-1

让我们定义倒数,我们的处理方式相同:

RCANTOR: z -> (x,y) (CANTOR(x,y)的倒数

RCANTOR((z+1)/2): ]-1:1[ -> ]01[x ]0,1[

then 1/Pi*tan(RCANTOR((z+1)/2)) + 1/2 : z ->(x,y)
                                      ]-1;1[ -> IRxIR

【讨论】:

    【解决方案2】:

    您需要类似于 (x, z) 对上的哈希函数。

    我会建议类似的东西

    (a * x + b * z + c) ^ d

    其中所有数字都是整数,a 和 b 是大素数,因此整数乘法溢出,c 和 d 是一些随机整数。 ^ 是按位异或。结果是一个随机整数,您可以将其缩放到所需的范围。

    这假设地图不用于了解地形具有重大价值的游戏中,因为这样的功能对于保密是不安全的。在这种情况下,你最好使用一些加密函数。

    【讨论】:

    • 谢谢!我最终使用了一种与您非常相似的方法。
    • 如何缩放到想要的范围,不缩放的范围是多少?
    【解决方案3】:

    只需选择任何旧的哈希函数,粘贴坐标的二进制描述并使用输出。

    【讨论】:

      猜你喜欢
      • 2016-05-24
      • 1970-01-01
      • 2018-06-15
      • 1970-01-01
      • 2014-04-06
      • 2014-05-18
      • 2011-02-08
      • 2015-08-07
      • 1970-01-01
      相关资源
      最近更新 更多