8

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

我还将尝试解释为什么我需要它:

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

Diamond-Square 的问题在于它使用随机函数,所以假设两个相邻块共享相同的点 (x, z),那么我希望它们的高度相同,这样我就不会出现裂缝影响。

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

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

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

4

3 回答 3

5

您需要类似于 pair 上的散列函数的东西(x, z)

我会建议像

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

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

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

于 2011-06-24T19:15:45.550 回答
2

如果您正在寻找来自 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
于 2011-06-24T16:04:04.460 回答
0

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

于 2011-06-24T19:55:29.290 回答