两个输入的伪随机数发生器

时间:2011-06-24 15:22:09

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

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

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

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

Diamond-Square的问题在于它使用随机函数,所以假设两个相邻的补丁共享相同的点(x,z)然后我希望它们的高度相同,所以我不会得到一些裂缝效果。

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

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

(我不是要求别人写这样的功能,我只是需要一般反馈和/或类似的已知算法)。

3 个答案:

答案 0 :(得分:4)

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

我会建议像

这样的东西

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

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

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

答案 1 :(得分: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

让我们定义reciproque,我们以相同的方式处理:

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 :(得分:0)

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