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

8
我需要一个伪随机数生成器,它可以从两个浮点型输入中返回范围在[-1, 1](可选范围)内的数字。
我也会尝试解释为什么我需要它:
我正在使用钻石-平方算法来创建我的地形引擎的高度图。地形被分成块(Chunked LOD)。
钻石-平方算法的问题在于它使用了随机函数,所以假设两个相邻的块共享同一点(x,z),那么我希望它们的高度都相同,这样就不会出现裂缝效果。
有些人可能会说我可以从相邻块中获取高度信息,但是结果可能会因先创建哪个块而不同。
因此,我需要一个伪随机数生成器,它能够根据两个输入(x,z)返回唯一的数字。
(我不是要求有人编写这样的功能,我只需要一般反馈和/或已知的执行类似操作的算法)。

我不太明白这个问题。如果一个数字是随机的,那么它就是随机的,唯一需要担心的因素是种子和分布。如果你想要的话,种子可以是这两个输入数字的任意组合。但结果仍然是完全随机的。请澄清您希望生成的数字的期望。 - Assaf Lavie
它不应该是随机的,我只是说Diamond-Square得到一个随机数。我正在寻求给定x、z的唯一数字,或者换句话说,给定两个输入的伪随机数生成器。这个问题上的随机标签相当令人困惑,我应该把它删除。我不是在请求任何人为我编写函数,但我很乐意得到一些反馈、方向或已知的算法。谢谢! - Jón Trausti Arason
3个回答

6
你需要对一对(x, z)类似于哈希函数的东西。
我建议使用以下公式: (a * x + b * z + c) ^ d 其中所有数字都是整数,ab 是大质数,这样整数乘法就会溢出,cd 是随机整数。 ^ 是按位异或。结果是一个随机整数,您可以将其缩放到所需范围内。
这假定该映射未用于知道地形具有实质价值的游戏中,因为这种函数不适用于保守秘密。在这种情况下,最好使用某些加密函数。

谢谢!我最终采用了和你的方法非常相似的方法。 - Jón Trausti Arason
你如何将数据缩放到所需范围内?不进行缩放的范围是什么? - clabe45

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[ 

通过构造,我们可以证明CANTOR(x,y)是从区间]0,1[x]0,1[到区间]0,1[的双射函数。(如果数字有无限小数位,我不确定它是否正确,但至少它是一个“非常好”的单射函数。如果我错了,请告诉我)

然后,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

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接