Цикл завершается раньше, чем хотелось бы

223
15 августа 2021, 07:10

Сколько попыток понадобится сделать компьютеру чтобы подобрать из рандомных букв слово которое вы ввели?

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 
    StringBuilder stringBuilder = new StringBuilder(); // будет формировать новое слово из рандомных букв
    Random random = new Random(); // великий псевдорандом
    String myWord = reader.readLine(); // ваше слово
    int wordLenght = myWord.length(); // количество символов в вашем слове
    int counterOfMyShances = 0; // счётчик попыток
    char[] alphabetArr = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'g', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'G', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'}; 
do { // выполняем процесс формирования слова в цикле 
for (int i = 0; i < wordLenght; i++) {
    int randomlLeter = random.nextInt(alphabetArr.length); // извлекаем случайную букву
    stringBuilder.append(alphabetArr[randomlLeter]); // формируем строку из букв
    counterOfMyShances ++;  
}
}while (myWord.equals(stringBuilder));  //всё вышеперечисленное выполняем до тех пор пока введённое и сгенерированное слова совпадут
     System.out.println(counterOfMyShances );

Цикл "do while" выполняет блок "do" далее сравнивает результат с блоком "while" и если второй блок не отвечает "Да, это try" начинает процесс с начала. Так? Мой код генерирует слово длиной строго равной длине введённого слова и дальше завершает процесс несмотря на то что слова не совпадают. Что я упустил? скажите пожалуйста.

Answer 1
public class Test {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder stringBuilder;// будет формировать новое слово из рандомных букв
        Random random = new Random(); // великий псевдорандом
        String myWord = reader.readLine(); // ваше слово
        int counterOfMyShances = 0; // счётчик попыток
        char[] alphabetArr = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'g', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'G', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
        do { // выполняем процесс формирования слова в цикле 
            stringBuilder = new StringBuilder();
            for (int i = 0; i < myWord.length(); i++) {
                int randomlLeter = random.nextInt(alphabetArr.length); // извлекаем случайную букву
                stringBuilder.append(alphabetArr[randomlLeter]); // формируем строку из букв
                counterOfMyShances++;
            }
        } while (!myWord.equals(stringBuilder.toString()));  //всё вышеперечисленное выполняем до тех пор пока введённое и сгенерированное слова совпадут
        System.out.println(counterOfMyShances);
    }
}
Answer 2

Относительно ошибок приводящие к некорректной работе алгоритма вам уже ответили, но я бы хотел обратить ваше внимание на крайнюю не оптимальность самого алгоритма.

Зачем в сравнении участвует регистр в момент поиска набора букв? Даже для ужесточения совпадения почему не применить разность регистров уже на этапе когда само слово совпадает и уже в рамках много меньшего кол-ва комбинаций подбирать регистр?

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

Answer 3

Ваш цикл выполняется столько раз, сколько раз два слова равны плюс один. Т.е. именно один раз. Нужно сравнивать не на равенство, а на неравенство.

while (!myWord.equals(stringBuilder))
READ ALSO
Обработать изображение из URL в SPRING BOOT

Обработать изображение из URL в SPRING BOOT

Не совсем понимаю как можно полностью вытащить изображение по url с помощью SpringУ меня простой REST контроллер post

143
Оптимизация spinner

Оптимизация spinner

Мой кастомный Spinner при первом клике на него долго открывается (~3 сек)Он состоит из 25 обьектов класса Person

151
Internet Explorer и Class JS

Internet Explorer и Class JS

Столкнулся с проблемойИмеется js class

112
Определение адреса и редирект

Определение адреса и редирект

Есть простой скрипт моментального редиректа:

209