LINUX.ORG.RU

Алгоритм генерации случайных чисел

 , ,


0

1

Есть одна программа для андроида, в которой работа идёт над некоторыми образами и для передачи образов между устройствами используются зёрна (seed) образов в виде короткой текстовой строки. Развёртка зерна начинается так:

Random r = new Random(seed.hashCode());

Далее код с использованием r.nextInt мне понятен. Я хочу реализовать алгоритм получения из зерна того же образа, которое андроид получает из этого же зерна. А для этого мне нужно реализовать аналогичный r.nextInt, hashCode, Random. Пока читаю исходники далвика и пока не очень врубаюсь. Может кто знает и кинет ссылку на описание известной схемы, если здесь такая используется?

PS походу далвик уже вышел из употребления и я ищу не там. Хотя сомнительно что такие принципы поменялись с новой платформой

★★★★★

Последнее исправление: ados (всего исправлений: 2)

Ответ на: комментарий от ados

Ну откуда же мне это знать? Я использую свою реализацию, дабы быть уверенным, что на разных платформах с одним и тем же сидом получать одну и ту же последовательность.

andreyu ★★★★★
()

Вроде все ссылки я уже получил из https://developer.android.com/. Осталось реализовать и сравнить результаты.

ados ★★★★★
() автор топика

Так а ты на жаве пишешь? Если да, то просто используй такой же жавовский стандартный рандом. Он по спецификации обязан совпадать.

morse ★★★★★
()

Вроде в Android OpenJDK используется. Вытащил суть, подробно по ссылкам можно посмотреть.

String.hashCode:

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }

Random:

    long seed;

    long multiplier = 0x5DEECE66DL;
    long addend = 0xBL;
    long mask = (1L << 48) - 1;

    public Random(long seed) {
        this.seed = initialScramble(seed);
    }

    long initialScramble(long seed) {
        return (seed ^ multiplier) & mask;
    }

    int nextInt() {
        return next(32);
    }

    int next(int bits) {
        seed = (seed * multiplier + addend) & mask;
        return (int)(seed >>> (48 - bits));
    }

Legioner ★★★★★
()

PS походу далвик уже вышел из употребления и я ищу не там

dalvik - это все ведроиды младше 4.4. начиная с 4.4 можно стало опционально включить art. с 5.0 штатно используется art с aot компиляцией в натив. в 8.0 его немножко перехерачили и вставили jit компиляцию

der_looser ★★
()
Ответ на: комментарий от Legioner

Реализовал я это. Вроде типа случайные числа получаются. Но вот у меня 2 аппарата на андроидах 7.0 сгенерировали 2 одинаковых образа по зерну, а у меня получается другое. Может константы другие?

ados ★★★★★
() автор топика
Последнее исправление: ados (всего исправлений: 1)
Ответ на: комментарий от ados

В общем написал я эмуляцию переполнения. Удивительно но это успех - проверил 6 зёрен и образы повторялись!

Всем спасибо!

ados ★★★★★
() автор топика
Последнее исправление: ados (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.