• In programming world, we often need to generate random numbers, sometimes random integers in a range e.g. 1 to 100 etc.
  • Random number generation in Java is easy as Java API provides good support for random numbers via java.util.Random class, Math.random() utility method and recently ThreadLocalRandom class in Java 7.
  • random() method is the most convenient way of generating randoms in Java it only returns random doubles, on the other hand by using Random, we can generate pseudo-random integer, floating point numbers e.g. double and even random boolean values.

Three ways to generate random integers in a range.

  1. java.util.Random.nextInt
  2. Math.random.
  3. java.util.Random.ints (Java 8)

java.util.Random

  • This Random().nextInt(int bound) generates a random integer from 0 (inclusive) to bound (exclusive).

For getRandomNumberInRange(5, 10), this will generates a random integer between 5 (inclusive) and 10 (inclusive).

java code
private static int getRandomNumberInRange(int min, int max) 
{

if (min >= max)
{
throw new IllegalArgumentException("max must be greater than min");
}

Random r = new Random();
return r.nextInt((max - min) + 1) + min;
}

What is (max – min) + 1) + min?

Above formula will generates a random integer in a range between min (inclusive) and max (inclusive).

//1. nextInt(range) = nextInt(max – min)

java code
//Random().nextInt(int bound) = Random integer from 0 (inclusive) to bound (exclusive)


new Random().nextInt(5); // [0...4] [min = 0, max = 4]
new Random().nextInt(6); // [0...5]
new Random().nextInt(7); // [0...6]
new Random().nextInt(8); // [0...7]
new Random().nextInt(9); // [0...8]
new Random().nextInt(10); // [0...9]
new Random().nextInt(11); // [0...10]
[ad type=”banner”]

//2. To include the last value (max value) = (range + 1)

java code
new Random().nextInt(5 + 1)  // [0...5] [min = 0, max = 5]
new Random().nextInt(6 + 1) // [0...6]
new Random().nextInt(7 + 1) // [0...7]
new Random().nextInt(8 + 1) // [0...8]
new Random().nextInt(9 + 1) // [0...9]
new Random().nextInt(10 + 1) // [0...10]
new Random().nextInt(11 + 1) // [0...11]

//3. To define a start value (min value) in a range,

//   For example, the range should start from 10 = (range + 1) + min

java code
new Random().nextInt(5 + 1)  + 10 // [0...5]  + 10 = [10...15]
new Random().nextInt(6 + 1) + 10 // [0...6] + 10 = [10...16]
new Random().nextInt(7 + 1) + 10 // [0...7] + 10 = [10...17]
new Random().nextInt(8 + 1) + 10 // [0...8] + 10 = [10...18]
new Random().nextInt(9 + 1) + 10 // [0...9] + 10 = [10...19]
new Random().nextInt(10 + 1) + 10 // [0...10] + 10 = [10...20]
new Random().nextInt(11 + 1) + 10 // [0...11] + 10 = [10...21]

// Range = (max – min)

// So, the final formula is ((max – min) + 1) + min

 

//4. Test [10…30]

// min = 10 , max = 30, range = (max – min)

java code
new Random().nextInt((max - min) + 1) + min
new Random().nextInt((30 - 10) + 1) + 10
new Random().nextInt((20) + 1) + 10
new Random().nextInt(21) + 10 //[0...20] + 10 = [10...30]

//5. Test [15…99]

// min = 15 , max = 99, range = (max – min)

java code
new Random().nextInt((max - min) + 1) + min
new Random().nextInt((99 - 15) + 1) + 15
new Random().nextInt((84) + 1) + 15
new Random().nextInt(85) + 15 //[0...84] + 15 = [15...99]
[ad type=”banner”]

Example:

To generate 10 random integers in a range between 5 (inclusive) and 10 (inclusive).

WikitechyRandom.java

java code
package com.wiki.example.test;
import java.util.Random;
public class WikitechyRandom
{
static void main(String[] args)
{
for (int i = 0; i < 10; i++)
{
System.out.println(getRandomNumberInRange(5, 10));
}
}
private static int getRandomNumberInRange(int min, int max)
{
if (min >= max)
{
throw new IllegalArgumentException("max must be greater than min");
}
Random r = new Random();
return r.nextInt((max - min) + 1) + min;
}
}
private static int getRandomNumberInRange(int min, int max)
{
if (min >= max)
{
throw new IllegalArgumentException("max must be greater than min");
}
Random r = new Random();
return r.nextInt((max - min) + 1) + min;
}
}
private static int getRandomNumberInRange(int min, int max)
{
if (min >= max)
{
throw new IllegalArgumentException("max must be greater than min");
}
Random r = new Random();
return r.nextInt((max - min) + 1) + min;
}
}
private static int getRandomNumberInRange(int min, int max) {
if (min >= max)
{
throw new IllegalArgumentException("max must be greater than min");
}
Random r = new Random();
return r.nextInt((max - min) + 1) + min;
}
}

Output.

  • 7
  • 6
  • 10
  • 8
  • 9
  • 5
  • 7
  • 10
  • 8
  • 5

Math.random

  • This Math.random() gives a random double from 0.0 (inclusive) to 1.0 (exclusive).

Formula:

int)(Math.random() * ((max – min) + 1)) + min

Example:

  • To generate 10 random integers in a range between 26 (inclusive) and 30 (inclusive).

WikitechyRandom.java

java code
package com.wiki.example.test;
public class WikitechyRandom
{

public static void main(String[] args)
{

for (int i = 0; i < 10; i++)
{
System.out.println(getRandomNumberInRange(26, 30));
}

}
private static int getRandomNumberInRange(int min, int max)
{

if (min >= max)
{
throw new IllegalArgumentException("max must be greater than min");
}

return (int)(Math.random() * ((max - min) + 1)) + min;
}

}
[ad type=”banner”]

Output.

  • 27
  • 26
  • 30
  • 29
  • 30
  • 30
  • 30
  • 27
  • 30
  • 26

Note:

  • The Random.nextInt(n) is more efficient than Math.random() * n

java.util.Random.ints

  • In Java 8, New methods are added in java.util.Random

public IntStream ints(int randomNumberOrigin, int randomNumberBound)

public IntStream ints(long streamSize, int randomNumberOrigin, int randomNumberBound)

  • This Random.ints(int origin, int bound) or Random.ints(int min, int max) generates a random integer from origin (inclusive) to bound (exclusive).
java code
private static int getRandomNumberInRange(int min, int max) 
{

Random r = new Random();
return r.ints(min, (max + 1)).findFirst().getAsInt();

}

Example :

  • To generate 10 random integers in a range between 43 (inclusive) and 48 (inclusive).

WikitechyRandom.java

java code
package com.wiki.form.test;

import java.util.Random;
public class WikitechyRandom
{
public static void main(String[] args)
{
for (int i = 0; i < 10; i++)
{
System.out.println(getRandomNumberInRange(43, 48));
}
}
private static int getRandomNumberInRange(int min, int max)
{
Random r = new Random();
return r.ints(min, (max + 1)).limit(1).findFirst().getAsInt();
}
}

Output.

  • 44
  • 45
  • 47
  • 43
  • 48
  • 47
  • 44
  • 45
  • 46
  • 47
[ad type=”banner”]

Categorized in: