8

float型の2つの入力から[-1、1](範囲はオプション)の範囲の数値を取得する疑似乱数ジェネレーターが必要です。

また、なぜそれが必要なのかを説明しようと思います。

地形エンジンの高さマップを作成するために、Diamond-Squareアルゴリズムを使用しています。地形はパッチに分割されます(チャンクLOD)。

Diamond-Squareの問題は、ランダム関数を使用することです。たとえば、2つの隣接するパッチが同じポイント(x、z)を共有している場合、クラックが発生しないように、すべてのパッチの高さを同じにします。効果。

隣接するパッチから高さ情報を取得できると言う人もいるかもしれませんが、パッチが最初に作成された後は結果が異なる可能性があります。

そのため、(x、z)という2つの入力が与えられた場合に一意の数値を返す疑似乱数ジェネレーターが必要です。

(私は誰かにそのような関数を書くように頼んでいません、私はただ一般的なフィードバックや同様のことをする既知のアルゴリズムが必要です)。

4

3 に答える 3

5

ペアのハッシュ関数に似たものが必要です(x, z)

私は次のようなものを提案します

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

ここで、すべての数値は整数でaありb、整数の乗算がオーバーフローするように大きな素数でありcdいくつかのランダムな整数です。^ビットごとの排他的 or です。結果は、目的の範囲にスケーリングできるランダムな整数です。

これは、地形を知ることが実質的な価値を持つゲームでマップが使用されないことを前提としています。その場合、暗号化機能を使用することをお勧めします。

于 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 に答える