Рейтинг:2

Как использовать RNG Java для поиска кластеров?

флаг sy

введите описание изображения здесь

На изображении выше вы можете видеть координатную сетку, содержащую несколько случайных зеленых точек. Каждая точка имеет псевдослучайный шанс 1/10 быть зеленым. То, что я ищу, - это кластеры этих зеленых точек в радиусе ~ 8 (игнорируйте показанную внутреннюю маску). Другими словами, я ищу статистически маловероятные области высокой плотности этих зеленых точек. В основе этой проблемы лежит Java RNG, найденный в java.util. Случайный (источник здесь). Код для определения того, является ли точка зеленой, сводится к этой хэш-функции. Входы являются некоторыми постоянными, $к$, и координаты точки, $х$ и $у$.

длинное семя = ((k + (длинное) (x * x * 4987142) + (длинное) (x * 5947611) + (длинное) (y * y) * 4392871L + (длинное) (y * 389711) ^ 987234911L) ^ 0x5DEECE66DL) & ((1L << 48) - 1);
целые биты, знач.;
делать
{
    seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
    биты = (int)((ulong)seed >> 17);
    знач = бит % 10;
} while (биты - val + 9 < 0);

вернуть значение == 0;

Там было небольшое исследование по этой проблеме в прошлом, но я недостаточно осведомлен, чтобы внести свой вклад. Было обнаружено, что потенциал кластеры с небольшими размерами 2х2 и 3х3 создают закономерность при сравнении с разными $к$ ценности. введите описание изображения здесь

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

введите описание изображения здесь

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

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

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

флаг kr
Как вы думаете, почему этот вопрос связан с криптографией? В коде используется псевдоГСЧ. Это означает, что для одного и того же семени он всегда будет давать **одинаковые** результаты. Это вопрос чистого программирования, и на него лучше ответить на SO.
Paul Uszak avatar
флаг cn
@mentallurg Держись. Хотя это очень красиво, основной темой этого вопроса является манипулирование/эксплуатация ГСЧ. Это атака, которая как раз по теме здесь. Переменная $k$ меняется по определению, и в этом суть. Многие из форумов .SE пересекаются, что, я думаю, является следствием неконтролируемого органического роста.
флаг kr
@PaulUszak: Вопрос о **псевдо ГСЧ**. Упомянутый код использует класс Random, который реализует PRNG. Одной из важных частей кода является то, что для каждого нового аргумента вычисляется новое начальное число. Установка одного и того же начального числа приводит к генерации **одинаковых** результатов. Это не имеет ничего общего с манипуляцией. И вопрос заключается в том, как **улучшить производительность**.
Gabe avatar
флаг sy
@mentallurg Я думаю, что этот вопрос очень соответствует духу криптографии. Я не прошу код для повышения производительности, я ищу общий ярлык. Какой смысл в теге **pseudo-random-generator**, если вопросы о PRNG не по теме???
Maarten Bodewes avatar
флаг in
Я вижу, что это несколько полезно для выполнения анализа PRNG, хотя мне интересно, насколько это входит в исследовательский вопрос, а не вопрос, на который можно ответить объективно без исследования.
флаг kr
@Gabe: 1) Тег на этом сайте имеет смысл, потому что псевдослучайные генераторы используются для многих криптографических задач. Если PRNG не используется для криптографических задач, это не по теме этого сайта. 2) Вы пишете: "*Я просто **грубая сила**... Я надеюсь, что... есть **основные оптимизации***". Это означает, что вы ищете оптимизацию производительности. Если бы проблема была связана с криптографией, это был бы уместный вопрос. Но так как вы не показываете никакой связи вашей проблемы с криптографией, то и эта оптимизация не по теме на этом сайте.
the default. avatar
флаг id
Это не криптографическая атака, а переписывание кода, чтобы он не пересчитывал «дельты» каждый раз и повторно использовал результаты прошлых вычислений, когда увеличение x позволило ему обработать те же 100 миллионов кусков за 2,3 секунды на гораздо более скромном уровне. 8-поточный процессор Ryzen 2500U: https://pastebin.com/UuDpVPQg (компилировать с `-fopenmp` для многопоточности). Перенос этого обратно в OpenCL должен сделать его достаточно быстрым для большинства практических целей.

Ответить или комментировать

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