Задать правильную реализацию алгоритма псевдослучайного стрима

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

  • В качестве первого элемента в последовательности берётся заданный сид = X0;
  • Последующие числа находятся последующим образом:
  • Xn = Xn-1;
  • Если кол-во цифр в числе Xn меньше либо равно 4, то возвращаем Xn;
  • Иначе, если кол-во цифр в числе Xn нечётное, то к нему добавляем в начале 0, напр. было число 54361, в результате получили временное значение 054361;
  • В противном случае, число остаётся неизменным;
  • В конечном итоге, за число Xn берутся средние четыре цифры в числе, напр. из 054361 возвращаем 5436.

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

private static IntStream pseudoRandomStream(int seed) {
    return IntStream.iterate(seed, PseudoRandomStream::getRandomInt);
}

private static int getRandomInt(int seed) {
    int length = String.valueOf(seed).length();
    if (length <= 4) {
        return (int) Math.pow(seed, 2);
    } else {
        String str = (length % 2 != 0) ? "0" + seed : String.valueOf(seed);
        int len = str.length() / 2;
        String s = str.substring(len - 2, len + 2);
        return Integer.parseInt(s);
    }
}

Т.е., если вызвать следующий код:

pseudoRandomStream(13).limit(10).forEach(n -> System.out.print(n + " "));

должна получиться следующую последовательность:

13 169 2856 1567 4554 7389 5973 6767 7922 7580

Но на деле получаю такое:

13 169 28561 2856 8156736 1567 2455489 4554 20738916 7389 54597321 5973 35676729 6767 45792289 7922 62758084 7580

Что-то делаю не так. Что именно?


Ответы (1 шт):

Автор решения: demmen

Нашёл решение. Стал обрабатывать возведение в квадрат очередного сида:

private static int getRandomInt(int seed) {
    int length = String.valueOf(seed).length();
    int pow = (int) Math.pow(seed, 2);
    if (String.valueOf(pow).length() > 4) {
        String str = (length % 2 != 0) ? "0" + pow : String.valueOf(pow);
        int len = str.length() / 2;
        String s = str.substring(len - 2, len + 2);
        return Integer.parseInt(s);
    } else {
        return pow;
    }
}
→ Ссылка