来自两个输入的伪随机数生成器



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

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

我正在使用菱形方块算法为我的地形引擎创建一个高度图。地形被分割为面片(分块LOD)。

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

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

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

(我并不是要求某人编写这样的函数,我只需要一个通用的反馈和/或已知的算法来做类似的事情)。

在对(x, z)上需要类似于散列函数的东西。

我建议使用

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

其中所有数字都是整数,ab是大素数,因此整数乘法溢出,cd是一些随机整数。CCD_ 7是逐位互斥或。结果是一个随机整数,您可以将其缩放到所需的范围。

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

如果您正在从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

让我们定义reciproque,我们用同样的方式处理:

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

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

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

最新更新