лучший генератор псевдослучайных чисел

Так как Java не имеет пересечь функции (действительно!?) можно сделать обнаружение коллизий просто comparying X и Y, Ширина и значения Высоты ограничительных рамок (прямоугольник) для каждого из объектов, которые могли потенциально столкнуться.

Так... в базовом объекте каждого сталкивающегося объекта... т.е. если у Вашего игрока и врага есть общая база, можно поместить простой Прямоугольный объект, названный чем-то как BoundingBox. Если общая база будет созданным в классе Java тогда, то необходимо будет создать класс, который расширяет сборку в классе, и имейте плеер, и вражеские объекты расширяют новый класс или являются экземплярами того класса.

При создании (и каждая галочка или обновление) необходимо будет установить BoundingBox paremeters и для игрока и для врага. У меня нет Прямоугольного класса infront меня, но ее наиболее вероятного что-то как X, Y, Ширина и наконец Высота. X и Y то, что местоположение объектов в Вашем игровом мире. Ширина и высота сам объяснительные, я думаю. Они, скорее всего, прибудут из права местоположения плееров, хотя так, если бы X и Y были bothe в 0 и Ваша Ширина и Высота, были оба в 256, Вы ничего не видели бы, потому что символ наверху оставят за пределами экрана.

Так или иначе... для обнаружения коллизии Вы захотите сравнить атрибуты плеера и вражеского BoundingBoxes. Так что-то вроде этого...

 if( Player.BoundingBox.X = Enemy.BoundingBox.X && If( Player.BoundingBox.Y = Enemy.BoundingBox.Y )
 {
      //Oh noes!  The enemy and player are on top of eachother.
 }

логика может получить вид сложных, но необходимо будет сравнить расстояния между каждым BoundingBox и сравнить местоположения.

24
задан Nishanth 18 January 2011 в 05:40
поделиться

3 ответа

Попробуйте преемника MT: SFMT ( http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/index.html ). Акроним расшифровывается как SIMD-ориентированный Fast Mersenne Twister . Он использует векторные инструкции, такие как SSE или AltiVec, чтобы ускорить генерацию случайных чисел.

Кроме того, он отображает большие периоды, чем исходный MT: SFMT может быть настроен на использование периодов до 2 216091 -1.

Наконец, у МТ были некоторые проблемы при плохой инициализации: он имел тенденцию рисовать много 0, что приводило к случайным числам плохого качества. Эта проблема может длиться до 700000 обращений, прежде чем будет компенсирована повторением алгоритма. Как следствие, SFMT также был разработан, чтобы выходить из этого состояния с нулевым избытком гораздо быстрее, чем его старший.

Проверьте ссылку, которую я дал в начале этого поста, чтобы найти исходный код и научные публикации, описывающие этот алгоритм.

Чтобы окончательно убедить вас, вы можете посмотреть здесь http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/speed.html таблица, сравнивающая скорости генерации как MT, так и SFMT. В любом случае, SFMT быстрее выдает лучшие качества, чем MT.

- редактировать следующие комментарии -

В целом, когда вы выбираете PRNG, вам необходимо учитывать разрабатываемое приложение. Действительно, некоторые PRNG лучше соответствуют ограничениям некоторых приложений. Например, генераторы MT и WELL не очень хорошо подходят для криптографических приложений, тогда как они являются лучшим выбором при работе с симуляциями Монте-Карло.

В нашем случае WELL может показаться идеальным благодаря своим лучшим свойствам равнораспределения, чем SFMT. Тем не менее, WELL также намного медленнее, и он не может отображать такие большие периоды, как SFMT.

В заключение следует сказать, что PRNG не может быть заявлен как лучший для всех приложений, но для конкретного домена и в определенных обстоятельствах.

20
ответ дан 28 November 2019 в 22:37
поделиться

Если вы ищете алгоритм, который проходит все статистические тесты, но все еще быстр, вы можете попробовать Xorshift-Algorithm . По сравнению со случайной библиотекой в ​​Java она примерно на 30% быстрее и обеспечивает лучшие результаты. Его Период не такой длинный, как у Мерсенна Твистер, но все же приличный.

Реализация может быть найдена здесь:

http://demesos.blogspot.com/2011/09/replacing-java-random-generator.html

Редактировать

Похоже, что новые варианты XORShift теперь даже превосходят MerseneTwister и WELL по качеству (но не по периодам). Они проходят более эмпирические тесты качества, как это видно в PRNG Shootout .

Они также впечатляют по производительности. Я провел тестирование различных реализаций в Java, источник и результаты здесь: https://github.com/tobijdc/PRNG-Performance

5
ответ дан 28 November 2019 в 22:37
поделиться
  1. проходит все статистические тесты

Каждый PRNG, упомянутый в других ответах, до сих пор широко принадлежит семейству PRNG GFSR / LFSR. Все они не соответствуют бинарному рангу матрицы и, возможно, тестам линейной сложности.

Есть много много PRNG, которые проходят все статистические тесты общего назначения, но по некоторым причинам люди, кажется, считают GFSR сексуальнее.

Вот пример PRNG, который проходит все статистические тесты общего назначения, но не является криптографически безопасным:

static unsigned long long rng_a, rng_b, rng_c, rng_counter;
unsigned long long rng64() {
    unsigned long long tmp = rng_a + rng_b + rng_counter++;
    rng_a = rng_b ^ (rng_b >> 12);
    rng_b = rng_c + (rng_c << 3);
    rng_c = ((rng_c << 25) | (rng_c >> (64-25))) + tmp;
    return tmp;
}
void seed(unsigned long long s) {
    rng_a = rng_b = rng_c = s; rng_counter = 1;
    for (int i = 0; i < 12; i++) rng64();
}

(Это предполагает, что long long является 64-битным целочисленным типом ... I думаете, это верно везде, для которого определен тип?)

Это достаточно для любого обычного использования, а также достаточно быстро. Если вам нужно что-то лучше, переключитесь на CSPRNG - они, как правило, намного лучше, чем любой не крипто-PRNG. Например, ChaCha ( http://cr.yp.to/chacha.html ) представляет собой твердый CSPRNG с быстрым заполнением, произвольным доступом и регулируемым качеством. HC-256 ( http://en.wikipedia.org/wiki/HC-256 ) - это еще более качественный CSPRNG, он медленный, но достаточно быстрый после посева.

  1. ведет себя хорошо даже при очень больших размерах

Это в значительной степени эквивалентно точке № 1. Кроме того, пример PRNG, который я предложил, относится к хаотическому типу - такие PRNG, если они плохо себя ведут, делают это при небольшом количестве измерений, а не при большом количестве.

  1. имеет чрезвычайно большой период

Определить чрезвычайно большой?

Пример PRNG, который я предложил выше, имеет доказуемый минимальный период 2 ^ 64, средний период 2 ^ 255 и пространство состояний 2 ^ 256. Для двух CSPRNG, которые я связал, ChaCha имеет период 2 ^ 68 и пространство состояний 2 ^ 260, а HC-256 имеет средний период где-то порядка 2 ^ 65000 или около того IIRC и предлагает вероятностное доказательство того, что его кратчайший цикл больше 2 ^ 128 с вероятностью больше 1- (2 ^ -128) и имеет пространство состояний около 2 ^ 65000.

На практике период не имеет значения более 2 ^ 60, и даже это маргинально. Обычно причина, по которой люди спрашивают о высоком периоде, заключается в том, что либо они не знают, о чем говорят, либо потому, что им нужно большое пространство состояний (которое, по крайней мере, равно периоду, но часто больше), что может быть полезно около 2 ^ 250. Но большое пространство состояний не очень поможет, если вы не заполняете что-то большее, чем одно целое число, а большинство людей этого не делают.

(примечание: в коде ^ используется для обозначения xor, но в тексте ^ используется для обозначения показателя степени)

4
ответ дан 28 November 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: