【问题标题】:Generating random words in Java?在Java中生成随机单词?
【发布时间】:2011-06-24 12:46:33
【问题描述】:

我编写了一个程序,可以对单词进行排序并确定任何字谜。我想生成一个随机字符串数组,以便我可以测试我的方法的运行时。

public static String[] generateRandomWords(int numberOfWords){
String[] randomStrings = new String[numberOfWords];
Random random = Random();
    return null;
}

(方法存根)

我只想要长度为 1-10 的小写单词。我读了一些关于生成随机数,然后转换为 char 或其他内容的内容,但我并不完全理解。如果有人可以向我展示如何生成随机单词,那么我应该可以轻松地使用 for 循环将单词插入数组中。谢谢!

【问题讨论】:

  • 随机词基于什么来源? (例如随机数 + ???? = 随机词)

标签: java arrays random words


【解决方案1】:

您需要实际的英文单词,还是只包含字母 a-z 的随机字符串?

如果您需要实际的英语单词,唯一的方法就是使用字典,并从中随机选择单词。

如果你不需要英语单词,那么这样的事情就可以了:

public static String[] generateRandomWords(int numberOfWords)
{
    String[] randomStrings = new String[numberOfWords];
    Random random = new Random();
    for(int i = 0; i < numberOfWords; i++)
    {
        char[] word = new char[random.nextInt(8)+3]; // words of length 3 through 10. (1 and 2 letter words are boring.)
        for(int j = 0; j < word.length; j++)
        {
            word[j] = (char)('a' + random.nextInt(26));
        }
        randomStrings[i] = new String(word);
    }
    return randomStrings;
}

【讨论】:

  • 谢谢!您需要做的一件事是将“a”转换为 char,否则编译器会吓坏您。谢谢大家!
  • 不,您不需要将'a' 转换为char,而是相加的结果(因为这会自动转换为int)。所以其实应该是word[j] = (char)('a' + random.nextInt(26));
  • 感谢您的更正,我已经有一段时间没有使用 Java 中的原始字符了。
  • 哈哈,没问题……修复需要大约 10 秒。
【解决方案2】:

RandomStringUtils 来自 commons-lang

【讨论】:

  • 新建链接,不再失效。
【解决方案3】:

为什么要生成随机词?什么时候可以使用some dictionaries

【讨论】:

  • 我试图获得一个平均运行时间,所以随机生成的单词应该给我最好的平均值。另外,这是学校作业,所以我必须符合我老师的要求......
  • 您应该指定这一点,并将您的问题标记为“家庭作业”
  • 哦,对不起,我什至不知道这是一个类别,但我想这很有意义。下次我一定会这样做。
  • 已修复。谢谢。
【解决方案4】:

如果您想生成给定长度的随机单词,您需要一种算法来确定给定字符串是否是一个单词(硬),或者访问给定语言中所有单词的单词列表(简单)。如果有帮助,here's a list of every word in the Scrabble dictionary

一旦您拥有一种语言中所有单词的列表,您就可以将这些单词加载到ArrayList 或其他线性结构中。然后,您可以在该列表中生成一个随机索引以获取随机单词。

【讨论】:

    【解决方案5】:

    您可以为要生成的每个单词调用此方法。请注意,生成字谜的概率应该相对较低。

    String generateRandomWord(int wordLength) {
        Random r = new Random(); // Intialize a Random Number Generator with SysTime as the seed
        StringBuilder sb = new StringBuilder(wordLength);
        for(int i = 0; i < wordLength; i++) { // For each letter in the word
            char tmp = 'a' + r.nextInt('z' - 'a'); // Generate a letter between a and z
            sb.append(tmp); // Add it to the String
        }
        return sb.toString();
    }
    

    【讨论】:

    • +1 但我建议使用StringBuilder 而不是out += ...
    • @casablanca 编译器不会优化他的算法以使用 StringBuilder 吗?
    • @Kin 我很确定它不会得到优化。
    • @Willi 你是对的。由于 String concat 在循环中,编译器不会优化循环操作。编译器将尝试优化琐碎的字符串连接。来源stackoverflow.com/questions/1532461/…
    • @Kin U., @Willi:编译器使用 StringBuilder,但他为每个 += 创建一个新的。这一行在编译后看起来像这样:out = new StringBuilder().append(out).append(r.nextInt('z'-'a')+'a').toString(); - 顺便说一下,你应该在这里再次转换为 char,因为 int + char = int,因此你的循环会将十进制数字附加到 StringBuilder。
    【解决方案6】:

    如果你想要随机单词而不使用字典...

    1. 列出所有你想要的字母列表
    2. 生成随机索引以从列表中挑选出一个字母
    3. 重复直到获得所需的字长

    对要生成的单词数量重复这些步骤。

    【讨论】:

      猜你喜欢
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      相关资源
      最近更新 更多