Генерация случайной строки указанной длины, которая содержит только указанные символы (в Java)
Кто-нибудь знает хороший способ генерации случайной строки заданной длины и символов в Java.
Например, длина может быть 5, а возможные символы могут быть a,b,c,1,2,3,!.
Так
c!a1b действителен
НО
cba16 нет.
Я мог бы попытаться написать что-то с нуля, но я чувствую, что это должно быть распространенным случаем для таких вещей, как генерация паролей, генерация кодов купонов и т.д...
Есть идеи?
4 ответа
Вы хотите что-то подобное?
Random r=new Random();
char[] possibleChars="abc123!".toCharArray();
int length=5;
char[] newPassword=new char[length];
for (int i=0; i<length;i++)
newPassword[i]=possibleChars[r.nextInt(possibleChars.length)];
System.out.println(new String(newPassword));
Код для этого довольно короткий. Имейте char[] или String с N допустимыми символами, и, раз, выберите случайное число R от 0 до N-1, используйте R, чтобы выбрать символ для добавления к вашей сгенерированной строке.
Я мог бы попытаться написать что-то с нуля, но я чувствую, что это должно быть распространенным случаем для таких вещей, как генерация паролей, генерация кодов купонов и т.д...
Это не так часто, и подробные требования каждый раз разные. Кроме того, код прост до такой степени, что он тривиален. (По модулю проблемы ниже... которые на самом деле о требованиях, а не о решении.)
Короче говоря, быстрее написать свой собственный метод, чем искать существующий метод библиотеки, который делает это.
Когда вы используете схему, которая включает в себя случайные числа, вы должны знать о возможности столкновения; то есть метод будет генерировать одну и ту же случайную строку более одного раза. Вы можете уменьшить это, используя более длинную строку, но это работает только до определенной точки... в зависимости от вашего генератора случайных чисел. (Типичные генераторы случайных чисел на самом деле являются генераторами псевдослучайных чисел и производят последовательность чисел, которая в конечном итоге циклически повторяется. И даже при совершенном генераторе случайных чисел существует конечная вероятность повторений в короткой последовательности.)
На самом деле, это еще одна причина, по которой решение вашей проблемы "один размер подходит всем" не является хорошей идеей.
Если это для реальной безопасности, в отличие от домашней работы или упражнения по программированию, используйте SecureRandom, а не Random.
На сайте Diceware вы найдете много хороших идей о случайной генерации паролей и других вещах.