Перейти к содержанию

Как в Java сгенерировать случайную строку

В этом руководстве узнаем, как генерировать случайную строку в Java, сначала используя стандартные библиотеки Java, затем используя вариант Java 8 и, наконец, используя библиотеку Apache Commons Lang.

Генерация случайной строки неограниченного размера с помощью Java

Начнем с простого и сгенерируем случайную строку, ограниченную 7 символами:

@Test
public void givenUsingPlainJava_whenGeneratingRandomStringUnbounded_thenCorrect() {
    byte[] array = new byte[7]; // длина ограничена 7
    new Random().nextBytes(array);
    String generatedString = new String(array, Charset.forName("UTF-8"));

    System.out.println(generatedString);
}

Имейте в виду, что новая строка не будет буквенно-цифровой.

Генерация случайной строки ограниченного размера с помощью Java

Посмотрим на создание более ограниченной случайной строки.

Сгенерируем случайную строку, используя строчные буквы алфавита и заданную длину:

@Test
public void givenUsingPlainJava_whenGeneratingRandomStringBounded_thenCorrect() {
 
    int leftLimit = 97; // буква 'a'
    int rightLimit = 122; // буква 'z'
    int targetStringLength = 10;
    Random random = new Random();
    StringBuilder buffer = new StringBuilder(targetStringLength);
    for (int i = 0; i < targetStringLength; i++) {
        int randomLimitedInt = leftLimit + (int) 
          (random.nextFloat() * (rightLimit - leftLimit + 1));
        buffer.append((char) randomLimitedInt);
    }
    String generatedString = buffer.toString();

    System.out.println(generatedString);
}

4. Генерация случайной строки из букв с помощью Java 8

Воспользуемся Random.ints, добавленным в JDK 8, для генерации алфавитной строки:

@Test
public void givenUsingJava8_whenGeneratingRandomAlphabeticString_thenCorrect() {
    int leftLimit = 97; // буква 'a'
    int rightLimit = 122; // буква 'z'
    int targetStringLength = 10;
    Random random = new Random();

    String generatedString = random.ints(leftLimit, rightLimit + 1)
      .limit(targetStringLength)
      .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
      .toString();

    System.out.println(generatedString);
}

Генерация случайной буквенно-цифровой строки с помощью Java 8

Затем можно расширить набор символов, чтобы получить буквенно-цифровую строку:

@Test
public void givenUsingJava8_whenGeneratingRandomAlphanumericString_thenCorrect() {
    int leftLimit = 48; // цифра '0'
    int rightLimit = 122; // буква 'z'
    int targetStringLength = 10;
    Random random = new Random();

    String generatedString = random.ints(leftLimit, rightLimit + 1)
      .filter(i -> (i <= 57 || i >= 65) && (i <= 90 || i >= 97))
      .limit(targetStringLength)
      .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
      .toString();

    System.out.println(generatedString);
}

Мы использовали описанный выше метод фильтрации, чтобы пропустить символы Unicode между 65 и 90, чтобы избежать появления символов вне допустимого диапазона.

Генерация ограниченной случайной строки с помощью Apache Commons Lang

Библиотека Commons Lang от Apache очень помогает при генерации случайных строк. Посмотрим на создание ограниченной строки, используя только буквы:

@Test
public void givenUsingApache_whenGeneratingRandomStringBounded_thenCorrect() {
 
    int length = 10;
    boolean useLetters = true;
    boolean useNumbers = false;
    String generatedString = RandomStringUtils.random(length, useLetters, useNumbers);

    System.out.println(generatedString);
}

Таким образом, вместо всего низкоуровневого кода в примере с Java здесь используется простой однострочный код.

Генерация алфавитной строки с помощью Apache Commons Lang

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

@Test
public void givenUsingApache_whenGeneratingRandomAlphabeticString_thenCorrect() {
    String generatedString = RandomStringUtils.randomAlphabetic(10);

    System.out.println(generatedString);
}

Генерация буквенно-цифровой строки с помощью Apache Commons Lang

Наконец, получим ту же самая случайную ограниченную строку, но на этот раз числовую:

@Test
public void givenUsingApache_whenGeneratingRandomAlphanumericString_thenCorrect() {
    String generatedString = RandomStringUtils.randomAlphanumeric(10);

    System.out.println(generatedString);
}

Мы создали ограниченные и неограниченные строки либо с помощью Java, либо с Java 8, либо с библиотекой Apache Commons.

Заключение

Благодаря различным способам реализации мы смогли сгенерировать ограниченные и неограниченные строки, используя обычную Java, вариант Java 8 или библиотеку Apache Commons.

В этих примерах использовали java.util.Random, но стоит упомянуть, что она не является криптографически безопасной. Рассмотрите возможность использования java.security.SecureRandom вместо приложений, чувствительных к безопасности.

Реализацию всех этих примеров и фрагментов можно найти в проекте GitHub. Это проект на основе Maven, поэтому его легко импортировать и запускать.

Оригинал