Есть ли возможность генерировать случайный символ в Java?

Есть ли у Java какие-либо функции для генерации случайных символов или строк? Или нужно просто выбрать случайное целое число и преобразовать этот целочисленный код ascii в символ?

Ответ 1

Существует много способов сделать это, но да, это включает в себя создание случайного int (используя, например, java.util.Random.nextInt), а затем используя это для сопоставления с char. Если у вас есть определенный алфавит, то что-то вроде этого отличное:

    import java.util.Random;

    //...

    Random r = new Random();

    String alphabet = "123xyz";
    for (int i = 0; i < 50; i++) {
        System.out.println(alphabet.charAt(r.nextInt(alphabet.length())));
    } // prints 50 random characters from alphabet

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

Ответ 2

Чтобы создать случайный char в a-z:

Random r = new Random();
char c = (char)(r.nextInt(26) + 'a');

Ответ 3

Вы также можете использовать RandomStringUtils из проекта Apache Commons:

RandomStringUtils.randomAlphabetic(stringLength);

Ответ 4

private static char rndChar () {
    int rnd = (int) (Math.random() * 52); // or use Random or whatever
    char base = (rnd < 26) ? 'A' : 'a';
    return (char) (base + rnd % 26);

}

Генерирует значения в диапазонах a-z, A-Z.

Ответ 5

В соответствии с 97 значением ascii малого "a".

public static char randomSeriesForThreeCharacter() {
Random r = new Random();
char random_3_Char = (char) (97 + r.nextInt(3));
return random_3_Char;
}

в выше 3 числа для a, b, c или d, и если u хочет, чтобы все символы, такие как a-z, вы заменяли 3 числа на 25.

Ответ 6

String abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

char letter = abc.charAt(rd.nextInt(abc.length()));

Это тоже работает.

Ответ 7

Вы можете использовать генераторы из основы проверки на основе спецификации Quickcheck.

Чтобы создать случайную строку, используйте метод anyString.

String x = anyString();

Вы можете создавать строки из более ограниченного набора символов или с ограничениями минимального/максимального размера.

Обычно вы запускаете тесты с несколькими значениями:

@Test
public void myTest() {
  for (List<Integer> any : someLists(integers())) {
    //A test executed with integer lists
  }
}

Ответ 8

используя dollar:

Iterable<Character> chars = $('a', 'z'); // 'a', 'b', c, d .. z

данный chars вы можете создать "перетасованный" диапазон символов:

Iterable<Character> shuffledChars = $('a', 'z').shuffle();

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

public String randomString(int n) {
    return $('a', 'z').shuffle().slice(n).toString();
}

NB: условие n > 0 перечеркнуто slice

EDIT

как правильно указал Стив, randomString использует не более одного раза каждую букву. Как обходной путь вы можете повторить алфавит m раз перед вызовом shuffle:

public String randomStringWithRepetitions(int n) {
    return $('a', 'z').repeat(10).shuffle().slice(n).toString();
}

или просто укажите свой алфавит как String:

public String randomStringFromAlphabet(String alphabet, int n) {
    return $(alphabet).shuffle().slice(n).toString();
}

String s = randomStringFromAlphabet("00001111", 4);

Ответ 9

Попробуйте это.

public static String generateCode() {

    String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    String fullalphabet = alphabet + alphabet.toLowerCase() + "123456789";
    Random random = new Random();

    char code = fullalphabet.charAt(random.nextInt(9));

    return Character.toString(code);

}

Ответ 10

У тебя это есть. Просто создайте случайные коды ASCII самостоятельно. Для чего вам это нужно?

Ответ 11

Взгляните на класс Java Randomizer. Я думаю, вы можете рандомизировать символ, используя метод randomize (char []).

Ответ 12

Ответ Polygenelubricants также является хорошим решением, если вы хотите генерировать только шестнадцатеричные значения:

/** A list of all valid hexadecimal characters. */
private static char[] HEX_VALUES = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'A', 'B', 'C', 'D', 'E', 'F' };

/** Random number generator to be used to create random chars. */
private static Random RANDOM = new SecureRandom();

/**
 * Creates a number of random hexadecimal characters.
 * 
 * @param nValues the amount of characters to generate
 * 
 * @return an array containing <code>nValues</code> hex chars
 */
public static char[] createRandomHexValues(int nValues) {
    char[] ret = new char[nValues];
    for (int i = 0; i < nValues; i++) {
        ret[i] = HEX_VALUES[RANDOM.nextInt(HEX_VALUES.length)];
    }
    return ret;
}

Ответ 13

Мое предложение для генерации случайной строки со смешанным случаем типа: "DthJwMvsTyu".
Этот алгоритм основан на кодах ASCII букв, когда его коды az (от 97 до 122) и AZ (от 65 до 90) отличаются в 5-м бите (2 ^ 5 или 1 << 5 или 32).

random.nextInt(2): результат равен 0 или 1.

random.nextInt(2) << 5: результат равен 0 или 32.

Верхний A равен 65, а нижний a равен 97. Разница только на 5-м бите (32), поэтому для генерации случайного символа мы делаем двоичный код OR '|' случайный charCaseBit (0 или 32) и случайный код от A до Z (от 65 до 90).

public String fastestRandomStringWithMixedCase(int length) {
    Random random = new Random();
    final int alphabetLength = 'Z' - 'A' + 1;
    StringBuilder result = new StringBuilder(length);
    while (result.length() < length) {
        final char charCaseBit = (char) (random.nextInt(2) << 5);
        result.append((char) (charCaseBit | ('A' + random.nextInt(alphabetLength))));
    }
    return result.toString();
}

Ответ 14

Вот код для генерации случайного буквенно-цифрового кода. Сначала вы должны объявить строку разрешенных символов, которую вы хотите включить в случайное число, а также определить максимальную длину строки.

 SecureRandom secureRandom = new SecureRandom();
 String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789";
    StringBuilder generatedString= new StringBuilder();
    for (int i = 0; i < MAXIMUM_LENGTH; i++) {
        int randonSequence = secureRandom .nextInt(CHARACTERS.length());
        generatedString.append(CHARACTERS.charAt(randonSequence));
    }

Используйте метод toString(), чтобы получить String из StringBuilder

Ответ 15

Это простое, но полезное открытие. Он определяет класс с именем RandomCharacter с 5 перегруженными методами для случайного получения определенного типа символов. Вы можете использовать эти методы в ваших будущих проектах.

    public class RandomCharacter {
    /** Generate a random character between ch1 and ch2 */
    public static char getRandomCharacter(char ch1, char ch2) {
        return (char) (ch1 + Math.random() * (ch2 - ch1 + 1));
    }

    /** Generate a random lowercase letter */
    public static char getRandomLowerCaseLetter() {
        return getRandomCharacter('a', 'z');
    }

    /** Generate a random uppercase letter */
    public static char getRandomUpperCaseLetter() {
        return getRandomCharacter('A', 'Z');
    }

    /** Generate a random digit character */
    public static char getRandomDigitCharacter() {
        return getRandomCharacter('0', '9');
    }

    /** Generate a random character */
    public static char getRandomCharacter() {
        return getRandomCharacter('\u0000', '\uFFFF');
    }
}

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

public class TestRandomCharacter {
    /** Main method */
    public static void main(String[] args) {
        final int NUMBER_OF_CHARS = 175;
        final int CHARS_PER_LINE = 25;
        // Print random characters between 'a' and 'z', 25 chars per line
        for (int i = 0; i < NUMBER_OF_CHARS; i++) {
            char ch = RandomCharacter.getRandomLowerCaseLetter();
            if ((i + 1) % CHARS_PER_LINE == 0)
                System.out.println(ch);
            else
                System.out.print(ch);
        }
    }
}

и вывод:

enter image description here

если вы запустите еще раз:

enter image description here

Я отдаю должное Ю.Даниэлю Лянгу за его книгу " Введение в программирование на Java, полная версия", 10-е издание, где я привел эти знания.

Ответ 16

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

MockNeat mock = MockNeat.threadLocal();

Character chr = mock.chars().val();
Character lowerLetter = mock.chars().lowerLetters().val();
Character upperLetter = mock.chars().upperLetters().val();
Character digit = mock.chars().digits().val();
Character hex = mock.chars().hex().val(); 

Ответ 17

   Random randomGenerator = new Random();

   int i = randomGenerator.nextInt(256);
   System.out.println((char)i);

Позаботьтесь о том, что вы хотите, считая, что вы считаете "0", "1", "2".. как символы.