Generate secure random number uniformly over a range in Java

java, random, security

Solution

You can do

Random rand = new SecureRandom()
// 0 to 100 inclusive.
int number = rand.nextInt(101);

or

// 0 inclusive to 100 exclusive.
int number = rand.nextInt(100);

Note: this is more efficient than say `(int) (rand.nexDouble() * 100)` as nextDouble() needs to create at least 53-bits of randomness whereas nextInt(100) creates less than 7 bits.

Problem

How do I generate a secure uniform random number within a range? The range could be between 0 to 100. (The upper bound is not a power of 2). `java.security.SecureRandom` seems to provide the range `0..2^n`.

Original source

Related problems