14

I wrote up a program that can sort words and determine any anagrams. I want to generate an array of random strings so that I can test my method's runtime.

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

(method stub)

I just want lowercase words of length 1-10. I read something about generating random numbers, then casting to char or something, but I didn't totally understand. If someone can show me how to generate random words, then I should easily be able to just use a for loop to insert the words into the array. Thanks!

Chris Dennett
  • 22,412
  • 8
  • 58
  • 84
Mr_CryptoPrime
  • 628
  • 2
  • 11
  • 25

6 Answers6

25

Do you need actual English words, or just random strings that only contain letters a-z?

If you need actual English words, the only way to do it is to use a dictionary, and select words from it at random.

If you don't need English words, then something like this will do:

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;
}
David Yaw
  • 27,383
  • 4
  • 60
  • 93
12

RandomStringUtils from commons-lang

Damian
  • 437
  • 5
  • 11
Aravind Yarram
  • 78,777
  • 46
  • 231
  • 327
5

Why generating random words? When you can use some dictionaries.

Yanick Rochon
  • 51,409
  • 25
  • 133
  • 214
  • 1
    I am trying to get an average runtime, so randomly generated words should give me the best average. Also, this is for a school assignment, so I must conform to what my teacher wants... – Mr_CryptoPrime Feb 10 '11 at 00:14
  • 3
    you should have specified that, and tagged your question as "homework" – Yanick Rochon Feb 10 '11 at 00:19
  • Oh, sorry I didn't even know that was a category, but I suppose that would make perfect sense. I will be sure to do that next time. – Mr_CryptoPrime Feb 10 '11 at 06:46
4

If you want to generate random words of a given length, you'll either need an algorithm to determine if a given string is a word (hard), or access to a word list of all the words in a given language (easy). If it helps, here's a list of every word in the Scrabble dictionary.

Once you have a list of all words in a language, you can load those words into an ArrayList or other linear structure. You can then generate a random index into that list to get the random word.

templatetypedef
  • 362,284
  • 104
  • 897
  • 1,065
2

You can call this method for each word you want to generate. Note that the probability of generating anagrams should be relatively low though.

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();
}
Argote
  • 2,155
  • 1
  • 15
  • 20
  • 2
    +1 but I would suggest using `StringBuilder` instead of doing `out += ...` – casablanca Feb 10 '11 at 00:15
  • @casablanca Wouldn't the compiler optimize his algorithm to use StringBuilder? – Kin Feb 10 '11 at 00:18
  • @Kin I'm pretty sure it wouldn't get optimized. – whiskeysierra Feb 10 '11 at 00:21
  • @Willi You are correct. Since the String concat is in a loop, the compiler will not optimize the loop operations. The compiler will try to optimize trivial String concats. Source http://stackoverflow.com/questions/1532461/stringbuilder-vs-string-concatenation-in-tostring-in-java – Kin Feb 10 '11 at 00:29
  • 1
    @Kin U., @Willi: The compiler uses the StringBuilder, but he creates for each `+=` a new one. This line looks after compiling like this: `out = new StringBuilder().append(out).append(r.nextInt('z'-'a')+'a').toString();` – By the way, you should here convert to char again, since int + char = int, and thus your loop will append decimal numbers to the StringBuilder. – Paŭlo Ebermann Feb 10 '11 at 00:42
1

If you want random words without using a dictionary...

  1. Make a list of all the letters you want possible in your words
  2. Generate a random index to pick out a letter from the list
  3. Repeat until you have your desired word length

Repeat these steps for the number of words you want to generate.

Kin
  • 1,435
  • 10
  • 16