Reputation: 157
I would like to generate Unique Pins based on a random number I have found this on Stack Overflow How to generate a random five digit number Java. That Question uses time to generate the numbers so therefore you get a lot of duplicates.
Here is my code
public int createRandomPin() {
int k = random.nextInt(Integer.SIZE);
k = (k + 1) * 9999;
if (9999 > k || k > 99999) {
//then regenerate
} else {
return k;
}
}
My Question
Java Compiler then gives a warning missing "return". As well I need to restructure the code so that if it isn't a 5 digit pin it generates again before it "returns k".
Upvotes: 7
Views: 27040
Reputation: 349
RandomUtils.randomNumeric(int count)
or RandomUtils.randomNumeric(int inLength, int maxLength)
from apache common lang3 can also be used for the same purpose.
Upvotes: 0
Reputation: 4329
I would suggest to generate random number using SecureRandom class and then as it needs to be of 5 digits create a random number between 0 and 99999 using random.nextInt(100000) , here 0 is inclusive and 100000 is exclusive and then format it into 5 digit by appending zero.
SecureRandom random = new SecureRandom();
int num = random.nextInt(100000);
String formatted = String.format("%05d", num);
System.out.println(formatted);
I hope this solves your problem
Edit: This post incorrectly said 10,000, has been edited to say 100,000
Upvotes: 15
Reputation: 133609
Integer.SIZE
yields the number in bits of the int
data type. This nothing has to do with the range span for a random value.
Using it as the argument of Random.nextInt
doesn't make any sense (actually it generates a random value in range [0,32)
).
Just generate a int value = random.nextInt(100000)
so that you will obtain a value in [0,99999]
.
Now your definition of 5 digits pin is not precise, 40
could be interpreted as 00040
so it's still 5 digits if you pad it. You must take this thing into account, since forcing 5 "visible" digits implies generating a number in range [10000,99999]
but this is just an awkward solution.
Upvotes: 1