在Java中生成随机单词?

14

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

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

(方法桩)

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


基于什么源生成随机单词?(例如,随机数字+????=随机单词) - Jason S
6个回答

25

你是需要实际的英文单词,还是只需要含有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,否则编译器会向你发出警告。谢谢大家! - Mr_CryptoPrime
1
不需要将'a'转换为char,但是需要将加法操作的结果(因为它是自动转换成int类型的)进行强制转换。所以实际代码应该是 word[j] = (char)('a' + random.nextInt(26)); - Paŭlo Ebermann
谢谢您的纠正,我已经有一段时间没有在Java中使用原始字符了。 - David Yaw
哈哈,没问题...只用了10秒钟就解决了。 - Mr_CryptoPrime
随机字母不是单词。 - Rafael Pizao

12

1
新链接已经上线,不再失效。 - Chris - Jr

5
为什么要生成随机单词?当你可以使用一些字典时。这些字典可以在这里找到。

1
我正在尝试获取平均运行时间,因此随机生成的单词应该给我最佳平均值。此外,这是一项学校作业,所以我必须遵守我的老师要求... - Mr_CryptoPrime
3
你应该明确指出这一点,并将你的问题标记为“作业”。 - Yanick Rochon
哦,抱歉我甚至不知道那是一个类别,但我想这是很合理的。下次我会记得这样做的。 - Mr_CryptoPrime
固定的。谢谢。 - Yanick Rochon

4
如果你想要生成指定长度的随机单词,你需要一个算法来确定给定字符串是否是一个单词(较难),或者获取包含所需语言所有单词的单词列表(易得)。如果有帮助的话,这里有一个完整的Scrabble字典中的单词列表
一旦你获得了一个包含所需语言所有单词的列表,你可以将这些单词加载到一个ArrayList或其他线性结构中。然后,你可以在该列表中生成一个随机索引以获取随机单词。

2
您可以针对想要生成的每个单词调用此方法。请注意,生成乱序词的概率应该相对较低。
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();
}

2
+1 但我建议使用 StringBuilder 而不是 out += ... - casablanca
@casablanca 编译器会优化他的算法以使用 StringBuilder 吗? - Kin
@Kin 我非常确定它不会被优化。 - whiskeysierra
@Willi 您是正确的。由于字符串连接在循环中,编译器将不会优化循环操作。编译器将尝试优化微不足道的字符串连接。来源 https://dev59.com/JnI_5IYBdhLWcg3wFu_L - Kin
1
@Kin U.,@Willi:编译器使用StringBuilder,但是每个+=都会创建一个新的。编译后,此行代码如下所示: out = new StringBuilder().append(out).append(r.nextInt('z'-'a')+'a').toString(); - 顺便提一下,你应该在这里重新将int转换为char,因为int + char = int,因此你的循环会将十进制数附加到StringBuilder中。 - Paŭlo Ebermann

1

如果你想得到不使用字典的随机单词...

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

针对你想要生成的单词数量,重复以上步骤。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接