Я пытаюсь написать код генератора паролей на Java и точно знаю, как я хочу это сделать. Моя проблема в том, что я не знаю, как достичь желаемой цели.
Я хочу использовать цикл for для поиска по строке, захвата случайного символа и сохранения этого символа в памяти программы. Затем я хочу повторять эту процедуру до тех пор, пока строка не будет содержать количество символов, указанное пользователем, и распечатать полученную строку на терминале.
Как я могу сделать это простым и понятным способом?
Попытка 1:
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
/**
* Write a description of class PasswordGenerator here.
*
* @author C.G.Stewart
* @version 06/06/18
*/
public class PasswordGenerator
{
private String input;
private int i;
private String newPass;
/**
* Constructor for objects of class Password
*/
public PasswordGenerator()
{
// initialise instance variables
input = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
ArrayList<String> Password = new ArrayList<String>();
Scanner pass = new Scanner(System.in);
}
/**
* This method generates a random alphanumeric string to be used as the new
* password
*/
public void generatePassword()
{
Random rnd = new Random();
for(i=1; i<=20; i++)
{
Math.random();
System.out.println(input.charAt(i));
}
//newPass = System.out.println(input.charAt(i));
}
/**
* This method takes the previously generated random alphanumeric string,
* and outputs it to the screen.
*/
public void newPassword()
{
System.out.println(newPass);
}
}
Попытка 2:
import java.util.Scanner;
import java.util.Random;
/**
* Write a description of class Password here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class Password
{
// instance variables - replace the example below with your own
private String index;
/**
* Constructor for objects of class Password
*/
public Password()
{
// initialise instance variables
index = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
Scanner pass = new Scanner(System.in);
}
//Returns a random alphanumeric string of an inputted length
public void printPassword()
{
for(int i=10; i<=20; i++)
{
while(i<=20)
{
Random rand = new Random();
char letter;
letter = index.charAt(i);
}
System.out.println(i);
}
}
}
Возможный дубликат: Генератор паролей Java
Добро пожаловать в Stack Overflow. Это не сервис написания кода / SQL / регулярных выражений, где вы публикуете список своих требований и языка по выбору, а кодовая обезьяна выдает код за вас. Мы более чем рады помочь, но ожидаем, что вы в первую очередь постараетесь решить проблему самостоятельно. Как только вы это сделаете, вы можете объяснить возникшую у вас проблему, включить в свою работу части уместным и задать конкретный вопрос, и мы постараемся помочь. Удачи.
@KenWhite Я попытался решить эту проблему, но единственный вывод, который я получаю, вовсе не случайный и не тот, который мне нужен удаленно. Единственный код, который у меня есть, - это код, который сильно поврежден, и поэтому он не имеет отношения к делу. Поэтому я спросил, была ли у кого-нибудь эта проблема раньше и как они к ней подошли.
Я не вижу усилий решить это в вашем посте. Если его нет в сообщении, значит, его не существует. Учитель, клянусь, я сделал домашнее задание, но собака его съела!




Есть несколько способов сделать это, вот некоторые из них:
Возможность 1:
public class PasswordGenerator {
private static SecureRandom random = new SecureRandom();
/** different dictionaries used */
private static final String ALPHA_CAPS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static final String ALPHA = "abcdefghijklmnopqrstuvwxyz";
private static final String NUMERIC = "0123456789";
private static final String SPECIAL_CHARS = "!@#$%^&*_=+-/";
/**
* Method will generate random string based on the parameters
*
* @param len
* the length of the random string
* @param dic
* the dictionary used to generate the password
* @return the random password
*/
public static String generatePassword(int len, String dic) {
String result = "";
for (int i = 0; i < len; i++) {
int index = random.nextInt(dic.length());
result += dic.charAt(index);
}
return result;
}
Взято из: Как сгенерировать случайный пароль на Java
Возможность 2:Random.ints
Возможность 3:
public final class RandomStringGenerator extends Object
// Generates a 20 code point string, using only the letters a-z
RandomStringGenerator generator = new RandomStringGenerator.Builder()
.withinRange('a', 'z').build();
String randomLetters = generator.generate(20);
// Using Apache Commons RNG for randomness
UniformRandomProvider rng = RandomSource.create(...);
// Generates a 20 code point string, using only the letters a-z
RandomStringGenerator generator = new RandomStringGenerator.Builder()
.withinRange('a', 'z')
.usingRandom(rng::nextInt) // uses Java 8 syntax
.build();
String randomLetters = generator.generate(20);
Взято из: Класс RandomStringGenerator
@KenWhite спасибо за информацию, добавил код по ссылкам!
Почему вам нужно использовать цикл for для поиска по строке, если вы просто хотите получить случайный символ из строки?
почему бы вам просто не сгенерировать случайное целое число и использовать его как индекс строки?
что-то вроде этого:
String str, password = "";
for (int i=0; i<passwordLength; i++){
Random rand = new Random();
int index = rand.nextInt(str.length());
password += str.charAt(index);
}
Некоторые подсказки к другим ответам:
Медленный:
string += "something" в цикле, используйте StringBuilderНебезопасный:
Random, используйте SecureRandomКод:
private static final String ALPHA_CAPS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static final String ALPHA = "abcdefghijklmnopqrstuvwxyz";
private static final String NUMERIC = "0123456789";
private static final String SPECIAL_CHARS = "!@#$%^&*_=+-/";
private static final SecureRandom random = new SecureRandom();
private static final char[] dic = (ALPHA_CAPS + ALPHA + NUMERIC + SPECIAL_CHARS).toCharArray();
public static String generatePassword(int len) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < len; i++) {
sb.append(dic[random.nextInt(dic.length)]);
}
return sb.toString();
}
Random.ints.