Случайная прогрессия в массиве

Рейтинг: 0Ответов: 1Опубликовано: 07.05.2023

Генерирую случайную последовательность и записываю ее в массив. Получаю последовательность, например (3 7 11 15 19 23 27).

Записываю ее в массив: [0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 11, 0, 0, 0, 15, 0, 0, 0, 19, 0, 0, 0, 23, 0, 0, 0, 27].

Сортирую и получаю: [3, 7, 11, 15, 19, 23, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0].

Теперь нужно обрезать. Поскольку в процессе формирования применяется случайное число, то обрезать надо как-то динамически. Как это сделать? Arrays.copyOfRange() применить не получается, потому что последний аргумент -- это длина исходного массива.

Можно ли вообще как-то сразу получить конечный массив без нулей?

Ответы

▲ 2Принят

Генерация пустого массива не представляется необходимой.

Лучше всего сразу сгенерировать требуемый список при помощи Stream API, где случайно формируются начальный элемент, шаг и количество элементов:

public static int[] getRandomSequence(int maxInput, int maxStep, int maxCount) {
    return getRandomSequence(0, maxInput, 1, maxStep, 1, maxCount);
}

public static int[] getRandomSequence(int minInput, int maxInput, int minStep, int maxStep, int minCount, int maxCount) {
    Random r = new Random();

    int step = minStep + r.nextInt(maxStep - minStep + 1);
    int count = minCount + r.nextInt(maxCount - minCount + 1);

    return IntStream.iterate(r.nextInt(maxInput), i -> i + step)
        .limit(count)
        .toArray();
}

Тесты:

int t = 5;
while (t-- > 0) {
    System.out.println(Arrays.toString(getRandomSequence(0, 10, t, 10, t, 10)));
}

Примерный результат:

[9, 15, 21, 27, 33]
[4, 14, 24, 34, 44, 54, 64, 74, 84]
[0, 6, 12, 18, 24, 30, 36, 42]
[5, 10, 15]
[4, 12, 20, 28, 36, 44, 52, 60]