Генератор псевдослучайных чисел с двух входов - PullRequest
7 голосов
/ 24 июня 2011

Мне нужен генератор псевдослучайных чисел, который дает мне число из диапазона [-1, 1] (диапазон необязательный) с двух входов типа float.

Я также попробую объяснить, зачем мне это нужно:

Я использую алгоритм Diamond-Square , чтобы создать карту высот для моего двигателя местности. Ландшафт разделен на участки (Chunked LOD).

Проблема с Diamond-Square заключается в том, что он использует случайную функцию, поэтому, скажем, два соседних патча совместно используют одну и ту же точку (x, z), тогда я хочу, чтобы высота была одинаковой для них всех, так что я не буду получить эффект крэка.

Некоторые могут сказать, что я могу получить информацию о высоте из соседнего патча, но тогда результат может отличаться после того, какой патч был создан первым.

Так вот почему мне нужен генератор псевдосигналов, который возвращает уникальное число с учетом двух входных данных (x, z).

(я не прошу кого-то написать такую ​​функцию, мне просто нужна общая обратная связь и / или известные алгоритмы, которые делают что-то подобное).

Ответы [ 3 ]

4 голосов
/ 24 июня 2011

Вам нужно что-то похожее на хэш-функцию в паре (x, z).

Я бы предложил что-то вроде

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

, где все числа являются целыми числами,a и b являются большими простыми числами, так что целочисленные умножения переполняются, а c и d являются случайными целыми числами.^ является побитовым или.Результатом является случайное целое число, которое можно масштабировать до желаемого диапазона.

Это предполагает, что карта не используется в игре, где знание местности имеет существенное значение, так как такая функция небезопасна для сохраненияэто секрет.В этом случае вам лучше использовать некоторую криптографическую функцию.

2 голосов
/ 24 июня 2011

Если вы ищете биекцию из IRxIR -> [-1; 1], я могу предложить это:

биекция от ИК до] -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 [. (Я не уверен, что это верно для числа с бесконечными десятичными знаками ... но это по крайней мере "очень хорошая" инъекция, скажите мне, если я не прав)

давайте назовем эту функцию: CANTOR (x, y)

затем 2 * CANTOR-1 является биекцией из] 0,1 [x] 0,1 [->] -1,1 [

Затем объединяем все вышеприведенные утверждения:

здесь, вы получаете биекцию от IRxIR ->] -1; 1 [...

Можно комбинировать с биекцией из ИК->] 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 голосов
/ 24 июня 2011

Просто выберите любую старую хеш-функцию, вставьте двоичное описание координат и используйте вывод.

...