Задать правильную реализацию алгоритма псевдослучайного стрима
Необходимо реализовать алгоритм стрима, который генерирует псевдослучайные числа на основе конкретного сида. Правила нахождения очередного числа следующие:
- В качестве первого элемента в последовательности берётся заданный сид = 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;
}
}