Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Help for creating a random String

I need to create a random string which should be between the length of 6 to 10 but it sometimes generates only about the length of 3 to 5. Here's my code. Can anyone would be able to find out the problem? :(

            int lengthOfName = (int)(Math.random() * 4) + 6;
        String name = "";
        /* randomly choosing a name*/
        for (int j = 0; j <= lengthOfName; j++) {
            int freq = (int)(Math.random() * 100) + 1;
            if(freq <= 6){
                name += "a";
            }if(freq == 7 && freq == 8){
                name += "b";
            }if(freq >= 9 && freq <= 11){
                name += "c";
            }if(freq >= 12 && freq <= 15){
                name += "d";
            }if(freq >= 16 && freq <= 25){
                name += "e";                        
            }if(freq == 26 && freq == 27){
                name += "f";
            }if(freq == 28 && freq == 29){
                name += "g";
            }if(freq >= 30 && freq <= 33){
                name += "h";
            }if(freq >= 34 && freq <= 48){
                name += "i";
            }if(freq == 49 && freq == 50){
                name += "j";
            }if(freq >= 51 && freq <= 55){
                name += "k";
            }if(freq >= 56 && freq <= 60){
                name += "l";
            }if(freq == 61 && freq == 62){
                name += "m";
            }if(freq >= 63 && freq <= 70){
                name += "n";
            }if(freq >= 71 && freq <= 75){
                name += "o";
            }if(freq == 76 && freq == 77){
                name += "p";
            }if(freq == 78){
                name += "q";
            }if(freq >= 79 && freq <= 84){
                name += "r";
            }if(freq == 85 && freq == 86){
                name += "s";
            }if(freq == 87 && freq == 88){
                name += "t";
            }if(freq >= 89 && freq <= 93){
                name += "u";
            }if(freq == 94){
                name += "v";
            }if(freq == 95 && freq == 96){
                name += "w";
            }if(freq == 97){
                name += "x";
            }if(freq == 98 && freq == 99){
                name += "y";
            }if(freq == 100){
                name += "z";
            }
        }
like image 354
Max Avatar asked Jun 05 '10 01:06

Max


1 Answers

I'm sorry but the code is too poorly written to be salvageable. I recommend something like this.

    Random r = new Random(); // just create one and keep it around
    String alphabet = "abcdefghijklmnopqrstuvwxyz";

    final int N = 10;
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < N; i++) {
        sb.append(alphabet.charAt(r.nextInt(alphabet.length())));
    }
    String randomName = sb.toString();

    System.out.println(randomName);

Key points are:

  • Use java.util.Random, specifically nextInt(int n) to get a random int in a given range
    • No need for funky formulas
  • When building a string in a loop, use StringBuilder.
  • Use an alphabet string, and charAt to index its letters.

API links

  • java.util.Random
    • int nextInt(int n)
      • Returns a pseudorandom, uniformly distributed int value between 0 (inclusive) and the specified value (exclusive)
  • StringBuilder - A mutable sequence of characters.

Related questions

  • String vs StringBuilder (C#)
  • String, StringBuffer and StringBuilder (Java)

Problems with the original code

There are plenty, unfortunately.

  • String += in a loop yields very poor performance for longer strings
  • for (int j = 0; j <= lengthOfName; j++) is an off-by-one-error
  • freq == 7 && freq == 8 is a logical contradiction
  • It's just unnecessarily verbose!
    • Warning signs should go off whenever you write something like that

I highly recommend doing lots of small but simple exercises to learn Java basics. codingbat.com is great; it has hundreds of these, they're automatically graded so you'll know when your solution works as expected or not. It has sections on logic, strings, arrays, etc.


On uneven letter distribution

The simplest solution is to just have duplicates in the alphabet:

  • String alphabet = "aab"; will have probability for a twice as much as b
  • You can generate the alphabet programmatically from a frequency table
    • I'll leave this as an exercise (or you can ask another question if you need it)
like image 168
polygenelubricants Avatar answered Oct 15 '22 20:10

polygenelubricants