我需要一个伪随机数生成器,它从float类型的两个输入中给出一个范围[-1,1](范围是可选的)中的数字。
我也会尝试解释为什么需要它:
我正在使用Diamond-Square algorithm为我的地形引擎创建高度贴图。地形被分成补丁(Chunked LOD)。
Diamond-Square的问题在于它使用随机函数,所以假设两个相邻的补丁共享相同的点(x,z)然后我希望它们的高度相同,所以我不会得到一些裂缝效果。
有些人可能会说我可以从邻居补丁中获取高度信息,但是在首先创建补丁之后结果会有所不同。
这就是为什么我需要一个伪数生成器,它返回一个给定两个输入的唯一数字,即(x,z)。
(我不是要求别人写这样的功能,我只是需要一般反馈和/或类似的已知算法)。
答案 0 :(得分:4)
您需要与(x, z)
对上的哈希函数类似的内容。
我会建议像
这样的东西 (a * x + b * z + c) ^ d
其中所有数字都是整数,a
和b
是大素数,因此整数乘法溢出,c
和d
是一些随机整数。 ^
是按位排他或。结果是一个随机整数,您可以将其缩放到所需的范围。
这假设地图不用于知道地形具有实质价值的游戏中,因为这样的功能对于保密是不安全的。在这种情况下,您最好使用一些加密功能。
答案 1 :(得分:2)
如果您正在寻找来自IRxIR的双射 - > [-1; 1],我可以建议:
首先让我们从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+
让我们写一下:
(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)
只需选择任何旧的哈希函数,粘贴在坐标的二进制描述中并使用输出。