как сгенерировать 3 слова, используя случайный класс - PullRequest
0 голосов
/ 28 октября 2019

Мне дается мульти-массив (основанный на случайном порядке выбранной страницы, абзаца и номера строки), который рассказывает историю. Мне нужно сгенерировать пароль, содержащий 3 слова, взятые случайным образом из массива. Необходимо создать правила для создания пароля (например: он должен быть длиной 10 символов, без повторения одного и того же слова);

Это для Java. (шаг 1) Пароль должен состоять из 3 слов (шаг 2) страницы, параграф и номер строки выбираются случайным образом и должны использовать случайный класс для генерации случайных чисел с помощью nextInt (). (шаг 3) Использовать split () для разделения каждого слова в случайной строке. (шаг 4) Обязательно выберите случайное слово из массива на шаге 3. (шаг 5) создайте ограничения для пароля.

Я создал оператор if-else для ограничения. Если правила не соблюдаются, программа всегда должна возвращаться к (шаг 2)

 import java.util.Random;

 public class passGen {

   public static void main(String[] args) {

   Random r=new Random();

int pageNum = r.nextInt(story.length);
    int paraNum = r.nextInt(story.length);
    int lineNum = r.nextInt(story.length);

    System.out.print("Password = ");

    for (int i = 0; i<3; i++) {

        String sentence = story[pageNum][paraNum][lineNum]; // story is the array given
        String[] string = sentence.split(" ");  
        int index = new Random().nextInt(string.length);            
        String randomWord = string[index];

        if (randomWord.equals("a") || randomWord.contains("\n")) {
        }
        else 
            System.out.print(randomWord);

    }
      }
    }

Допустим, генератор случайных чисел выбирает случайное предложение из массива: story [0] [1][5] дает "Мальчик едет на велосипеде \ n". Используя split (), а затем случайным образом выбирая слово на основе его индекса, он выбирает случайное слово «велосипед \ n». Я установил правило, что если он выбирает слово с новой строкой ('\ n'), он должен вернуться к шагу, где он снова генерирует случайные числа и дает мне новый массив и находит мне новое случайное слово, пока не находит меняслово, которое не имеет \ n. Например, предположим, что story [0] [1] [6] - «Он веселится».

Я ожидал, что на выходе будет напечатан один пароль с 3 случайными словами, объединенными все время.

         password =  boyfun.having   // fun. is considered as one word with the period.

но были случаи, когда при неудаче он печатал только те слова, которые прошли ограничение ('\ n'). Иногда он напечатал бы 1 слово или 2 слова, или это выдаст ошибку при запуске программы.

password = ridingfun

password = boy 

Password = Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at Assign3Q1.main(passGen.java:123)

// line 123 happens is the String sentence = story[pageNum][paraNum][lineNum];

Ответы [ 2 ]

0 голосов
/ 28 октября 2019

Я считаю, что ваша проблема в:

int pageNum = r.nextInt(story.length);
int paraNum = r.nextInt(story.length);
int lineNum = r.nextInt(story.length);

Количество абзацев зависит от страницы, а количество строк зависит от страницы и абзаца. Я подозреваю, что вы хотите:

int pageNum = r.nextInt(story.length);
int paraNum = r.nextInt(story[pageNum].length);
int lineNum = r.nextInt(story[pageNum][paraNum].length);

Что касается поиска трех слов, которые соответствуют вашим критериям, перед объединением их можно использовать потоки для достижения этого, а не цикл for. В настоящее время слова, которые не соответствуют вашим критериям, будут просто незаметно игнорироваться:

Stream.generate(this::randomWord)
    .filter(w -> !w.contains("\n"))
    .limit(3)
    .collect(Collectors.joining());

В противном случае вам понадобится счетчик для количества слов:

int wordsRequired = 3;
while (wordsRequired > 0) {
    String randomWord = ...;
    if (!randomWord.contains("\n")) {
        System.print...
        randomWord--);
    }
}

Также обратите внимание, чтоВы можете автоматически удалять переводы строк, используя split("\\s"). Это разделит любой пробел (а не только пробелы), который включает в себя новые строки и вкладки.

0 голосов
/ 28 октября 2019

Не уверен на 100%, что вы имеете в виду, но я почти уверен, что вы в конечном итоге достигнете предела, используя генератор случайных чисел.

Если ваша история имеет длину 10, nextInt может выбрать 10 какэто включает в себя int вы передаете его. Поэтому, если вы получите 10, а затем сделаете историю [10], вы получите выход за пределы, поскольку индекс начинается с 0.

Я предлагаю

r.nextInt(story.length - 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...