如何使用随机类生成3个单词

时间:2019-10-28 03:26:08

标签: java arrays loops for-loop random

我得到了一个讲述故事的多数组(基于随机选择的页面,段落和行号)。我需要生成一个密码,其中包含从数组中随机抽取的3个单词。必须给出创建密码的规则(例如:密码长度必须为10个字符,并且不得重复相同的单词);

这是针对Java的。 (第1步)密码必须由3个单词组成(第2步),页面,段落和行号是随机选择的,并且必须使用random类通过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(),然后根据其索引随机选择单词,它会选择随机单词“ bicycle \ n”。我制定了一条规则,如果它选择一个带有换行符('\ n')的单词,则必须返回到再次生成随机数并给我一个新数组并找到一个新的随机单词直到找到一个新单词的步骤。没有\ n的单词。例如,假设故事[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 :(得分:0)

不能100%知道您的意思,但是我很确定您最终会使用随机数生成器超出范围。

如果故事的长度为10,则nextInt可以选择10,因为它包括您传递的故事的长度。因此,如果您最终得到10,然后执行故事[10],则由于索引从0开始,您将超出范围。

我建议

r.nextInt(story.length - 1)

答案 1 :(得分:0)

我相信您的问题出在

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")自动删除换行符。这将在包含换行符和制表符的任何空格(而不是空格)上分割。