File APIs for Java Developers
Manipulate DOC, XLS, PPT, PDF and many others from your application.
The moose likes Java in General and the fly likes how to generate random unique alphanumeric numbers Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login
JavaRanch » Java Forums » Java » Java in General
Bookmark "how to generate random unique alphanumeric numbers" Watch "how to generate random unique alphanumeric numbers" New topic

how to generate random unique alphanumeric numbers

Shiva Kumar Shedad

Joined: Jun 11, 2007
Posts: 10

I have to generate random unique alphanumeric numbers.

I had used com.Ostermiller.util.RandPass api to generate random alphanumeric but sometimes it is generating only alphabets.

I had also tried some example using java.util.Random api, it is also generating only alphabets in some cases.

Please give me some suggestion... Thank you
Campbell Ritchie

Joined: Oct 13, 2005
Posts: 46320
Alphanumeric numbers? That's an oxymoron.

Try a random number n between 0 and 35; if it is over 25 use n%26 and use that as a digit; if less than 26 use n+1 where a=1, b=2, etc. You can add 0x41 to it and cast to a char.
David O'Meara

Joined: Mar 06, 2001
Posts: 13459

Hmm, I though "random unique" was possibly an oxymoron.
Campbell Ritchie

Joined: Oct 13, 2005
Posts: 46320
Never noticed that; they are both oxymorons.
Mark Vedder
Ranch Hand

Joined: Dec 17, 2003
Posts: 624

Another idea is to create an array of values you want to include in the password. Randomly generate a valid array index, then pull that value from the array. See this page for an example.

If you want to ensure that at least one number and one letter are included, there are a couple of things you can do:

1) simply check the generated string using a regex. If it does not include at least one number and one letter, reject it and generate a new one. A bit brute force, but it works, and given today's CPU power, it doesn't cost too much to potentially throw a few "bad" values away until a valid one is generated. So you could still use the RandPass API you found, or use the any of the above ideas.

2) Create two arrays. One that is all letters and one that is letters, numbers and any allowable special characters. Generate two random numbers that are less than the size of the desired String (say 10) you want to generate. Make sure the two numbers are not the same. If so, keep regenerating the second one until its different. These will become index values for a CharSequence or char array that will become the final string (say we generated 8 & 3). For the first index number (8), generate a random number from 0-9 (you may want to leave out 0 since it can be confused with the letter O.) Use that number (say 5) in the first random index (so index 8 in this case). Then generate a number that is in the index range of your letter only array. (or use Campbell's char conversion idea if using the ASCII range of A-Z.) The advantage of the array is you can leave out the letter 'O' which might be confused with the number 0. That letter (say R) becomes the value of the second index (3 in our example). So at this point we ___R____5_. At this point we have met our requirement of one number and one letter, but they are not always in the same place in our String (thus weakening our password). Fill in the remaining blanks by generating a random number within the index range of the array that contains letters and numbers, and special characters. Use the character at that index in the array. Repeat for all remaining blanks in your desired password. This technique can be used if you have a requirement for any combination of things... at least one upper and one lower case, at least one number, at least one special character... etc.

I hope that helps.
[ August 25, 2008: Message edited by: Mark Vedder ]
Mike Simmons
Ranch Hand

Joined: Mar 05, 2008
Posts: 3028
[DOM]: Hmm, I though "random unique" was possibly an oxymoron.

Nope. There are many kinds of random distributions - an even, unchanging distribution over a finite range may be the simplest thing to imagine, but it's not the only possibility. And it's not hard to generate random unique numbers, if you can persist a list (set, really) of already-used values in a DB somewhere. Though there will be problems if you exhaust the range of possible numbers. E.g. if you limit yourself to positive three-digit numbers, you can only call the method a thousand times before unique results become impossible. Similar limitations exist for any finite range you might choose - it's just a question of scale.
I agree. Here's the link:
subject: how to generate random unique alphanumeric numbers
It's not a secret anymore!