Есть ли у Java какие-либо функции для генерации случайных символов или строк? Или нужно просто выбрать случайное целое число и преобразовать этот целочисленный код ascii в символ?
Есть ли возможность генерировать случайный символ в Java?
Ответ 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);
}
}
}
и вывод:
если вы запустите еще раз:
Я отдаю должное Ю.Даниэлю Лянгу за его книгу " Введение в программирование на 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".. как символы.