Generate Random Integers – nextInt Java Example
In this post, we feature a comprehensive article about how to Generate Random Integers, using a nextInt Java Example.
1. Introduction
Java JDK has provided the following utility classes to generate random integers over time: The java.util.Random class from version 1.0, java.util.concurrent.ThreadLocalRandom class from version 1.7, and java.util.SplittableRandom class from version 1.8. These classes provide the nextInt
method to generate a random integer and ints
method to generate a stream of random integers. Here are the syntax details:
/** * * @return the next pseudorandom, uniformly distributed int value from this * random number generator's sequence. */ int nextInt(); /** * * @param bound the upper bound (exclusive). * @return a pseudorandom, uniformly distributed int value between 0 (inclusive) * and the specified value (exclusive), drawn from this random number * generator's sequence. */ int nextInt(int bound); /** * * @param origin the least value returned * @param bound the upper bound (exclusive). * @return a pseudorandom int value between the specified origin (inclusive) and * the specified bound (exclusive). */ int nextInt(int origin, int bound); /** * * @return an effectively unlimited stream of pseudorandom int values. */ IntStream ints(); /** * * @param randomNumberOrigin the least value returned * @param randomNumberBound the upper bound (exclusive) * @return an effectively unlimited stream of pseudorandom int values, each * conforming to the given origin (inclusive) and bound (exclusive). */ IntStream ints(int randomNumberOrigin, int randomNumberBound); /** * * @param streamSize the number of values to generate * @return a stream producing the given streamSize number of pseudorandom int * values. */ IntStream ints(long streamSize); /** * * @param streamSize the number of values to generate * @param randomNumberOrigin the least value returned * @param randomNumberBound the upper bound (exclusive) * @return a stream producing the given streamSize number of pseudorandom int * values, each conforming to the given origin (inclusive) and bound * (exclusive). */ IntStream ints(long streamSize, int randomNumberOrigin, int randomNumberBound);
In this example, I will create a Java application to generate a singular and a set of random integers.
2. Technologies used
The example code in this article was built and run using:
- Java 1.8.101
- Eclipse Oxygen
3. nextInt Java Project
In this step, I will create a Java project which contains a Java application to generate random integers.
3.1 Random
The java.util.Random
class has provided the nextInt()
method since version 1.0. It has added the nextInt(int bound)
since version 1.2. Both methods generate a random integer number. It has added the ints
method with four signatures to generate a stream of random integers since version 1.8.
In this step, I will create a With_Random
class to generate a singular and a stream of random integers.
With_Random.java
package org.jcg.zheng.random; import java.util.Random; import org.jcg.zheng.RandomIntegerBase; import org.jcg.zheng.SignatureType; public class With_Random extends RandomIntegerBase { private Random random = new Random(); @Override protected SignatureType[] getNextIntSignatures() { return new SignatureType[] { SignatureType.NONE, SignatureType.HAS_BOUNDARY }; } @Override protected SignatureType[] getIntsSignatures() { return new SignatureType[] { SignatureType.NONE, SignatureType.HAS_BOUNDARY, SignatureType.HAS_BOUNDARY_AND_ORIGIN, SignatureType.HAS_SIZE }; } @Override protected int getRandomInteger(SignatureType methodSignatureType) { int randomNum = -1; switch (methodSignatureType) { case NONE: randomNum = random.nextInt(); break; case HAS_BOUNDARY: randomNum = random.nextInt(boundary); break; case HAS_BOUNDARY_AND_ORIGIN: break; case HAS_SIZE: break; default: break; } return randomNum; } @Override protected int[] getRandomInts(SignatureType methodSignatureType) { int[] randomNums = null; switch (methodSignatureType) { case NONE: randomNums = random.ints().limit(streamSize).toArray(); break; case HAS_BOUNDARY: randomNums = random.ints(origin, boundary).limit(streamSize).toArray(); break; case HAS_BOUNDARY_AND_ORIGIN: randomNums = random.ints(streamSize, origin, boundary).toArray(); break; case HAS_SIZE: randomNums = random.ints(streamSize).toArray(); break; default: break; } return randomNums; } }
3.2 ThreadLocalRandom
The Java 7 java.util.concurrent.ThreadLocalRandom
class provides the nextInt
method to generate a random integer. It has added the ints
method since version 1.8.
In this step, I will create a With_ThreadLocalRandom
class to generate a singular and a stream of random integers.
With_ThreadLocalRandom.java
package org.jcg.zheng.random; import java.util.concurrent.ThreadLocalRandom; import org.jcg.zheng.RandomIntegerBase; import org.jcg.zheng.SignatureType; public class With_ThreadLocalRandom extends RandomIntegerBase { @Override protected int getRandomInteger(SignatureType methodSignatureType) { int randomNum = -1; switch (methodSignatureType) { case NONE: randomNum = ThreadLocalRandom.current().nextInt(); break; case HAS_BOUNDARY: randomNum = ThreadLocalRandom.current().nextInt(boundary); break; case HAS_BOUNDARY_AND_ORIGIN: randomNum = ThreadLocalRandom.current().nextInt(origin, boundary); break; case HAS_SIZE: break; default: break; } return randomNum; } @Override protected int[] getRandomInts(SignatureType methodSignatureType) { int[] randomNums = null; switch (methodSignatureType) { case NONE: randomNums = ThreadLocalRandom.current().ints().limit(streamSize).toArray(); break; case HAS_BOUNDARY: randomNums = ThreadLocalRandom.current().ints(origin, boundary).limit(streamSize) .toArray(); break; case HAS_BOUNDARY_AND_ORIGIN: randomNums = ThreadLocalRandom.current().ints(streamSize, origin, boundary).toArray(); break; case HAS_SIZE: randomNums = ThreadLocalRandom.current().ints(streamSize).toArray(); break; default: break; } return randomNums; } @Override protected SignatureType[] getNextIntSignatures() { return new SignatureType[] { SignatureType.NONE, SignatureType.HAS_BOUNDARY, SignatureType.HAS_BOUNDARY_AND_ORIGIN }; } @Override protected SignatureType[] getIntsSignatures() { return new SignatureType[] { SignatureType.NONE, SignatureType.HAS_BOUNDARY, SignatureType.HAS_BOUNDARY_AND_ORIGIN, SignatureType.HAS_SIZE }; } }
3.3 SplittableRandom
The Java 8 java.util.SpilttaleRandom
class provides the nextInt
and ints
methods to return a singular and stream of random integers.
In this step, I will create a With_SplittableRandom
class to generate a singular and a stream of random integers.
With_SplittableRandom.java
package org.jcg.zheng.random; import java.util.SplittableRandom; import org.jcg.zheng.RandomIntegerBase; import org.jcg.zheng.SignatureType; public class With_SplittableRandom extends RandomIntegerBase { SplittableRandom random = new SplittableRandom(); @Override protected int getRandomInteger(SignatureType methodSignatureType) { int randomNum = -1; switch (methodSignatureType) { case NONE: randomNum = random.nextInt(); break; case HAS_BOUNDARY: randomNum = random.nextInt(boundary); break; case HAS_BOUNDARY_AND_ORIGIN: randomNum = random.nextInt(origin, boundary); break; case HAS_SIZE: break; default: break; } return randomNum; } @Override protected int[] getRandomInts(SignatureType methodSignatureType) { int[] randomNums = null; switch (methodSignatureType) { case NONE: randomNums = random.ints().limit(streamSize).toArray(); break; case HAS_BOUNDARY: randomNums = random.ints(origin, boundary).limit(streamSize).toArray(); break; case HAS_BOUNDARY_AND_ORIGIN: randomNums = random.ints(streamSize, origin, boundary).toArray(); break; case HAS_SIZE: randomNums = random.ints(streamSize).toArray(); break; default: break; } return randomNums; } @Override protected SignatureType[] getNextIntSignatures() { return new SignatureType[] { SignatureType.NONE, SignatureType.HAS_BOUNDARY, SignatureType.HAS_BOUNDARY_AND_ORIGIN }; } @Override protected SignatureType[] getIntsSignatures() { return new SignatureType[] { SignatureType.NONE, SignatureType.HAS_BOUNDARY, SignatureType.HAS_BOUNDARY_AND_ORIGIN, SignatureType.HAS_SIZE }; } }
3.4 SignatureType
In this step, I will create an enum
class to define the signature type used in both the nextInt
and ints
methods.
SignatureType.java
package org.jcg.zheng; public enum SignatureType { NONE, HAS_BOUNDARY, HAS_BOUNDARY_AND_ORIGIN, HAS_SIZE; }
3.5 RandomIntegerBase
In this step, I will create an abstract class – RandomIntegerBase
which will print out a random integer and a stream of random integers.
RandomIntegerBase.java
package org.jcg.zheng; import java.util.Arrays; public abstract class RandomIntegerBase { protected int boundary = 10; protected int origin = 0; protected int streamSize = 5; protected abstract int getRandomInteger(SignatureType signatureType); protected abstract int[] getRandomInts(SignatureType methodSignature); protected abstract SignatureType[] getNextIntSignatures(); protected abstract SignatureType[] getIntsSignatures(); protected void randomInteger() { for (SignatureType methodSignature : getNextIntSignatures()) { System.out.println("\n\twith signature: " + methodSignature.name()); for (int i = origin; i < boundary; i++) { System.out.print(getRandomInteger(methodSignature) + "\t"); } } } protected void randomIntegerArray() { for (SignatureType methodSignature : getIntsSignatures()) { System.out.println("\n\twith signature: " + methodSignature.name()); Arrays.stream(getRandomInts(methodSignature)) .forEach(r -> System.out.print(r + "\t")); } } }
3.6 Random Application
In this step, I will create a Java application which generates a singular and stream of random integers via With_Random
, With_ThreadLocalRandom
, and With_SplittableRandom
RandomApplication.java
package org.jcg.zheng; import org.jcg.zheng.random.With_Random; import org.jcg.zheng.random.With_SplittableRandom; import org.jcg.zheng.random.With_ThreadLocalRandom; public class RandomApplication { public static void main(String[] args) { With_Random randomNextInt = new With_Random(); System.out.println("\nGenerate a random integer with Random.nextInt "); randomNextInt.randomInteger(); System.out.println("\n\nGenerate a stream of integers with Random.ints "); randomNextInt.randomIntegerArray(); With_SplittableRandom splittableRandom = new With_SplittableRandom(); System.out.println("\n\nGenerate a random integer with SplittableRandom.nextInt "); splittableRandom.randomInteger(); System.out.println("\n\nGenerate a stream of integers with SplittableRandom.ints "); splittableRandom.randomIntegerArray(); With_ThreadLocalRandom localRandom = new With_ThreadLocalRandom(); System.out.println("\n\nGenerate a random integer with ThreadLocalRandom.nextInt "); localRandom.randomInteger(); System.out.println("\n\nGenerate a stream of integers with ThreadLocalRandom.ints "); localRandom.randomIntegerArray(); } }
4. Demo
In this step, I will execute the Java application and capture the output here.
Output
Generate a random integer with Random.nextInt with signature: NONE 179849868 -771773519 1892153862 124664961 -1895403012 141282545 -1493084355 1670606027 1751879145 -768408023 with signature: HAS_BOUNDARY 4 3 7 2 1 2 7 0 2 0 Generate a stream of integers with Random.ints with signature: NONE -1363796045 -671530137 2126004220 1016481001 1360997539 with signature: HAS_BOUNDARY 7 6 2 3 9 with signature: HAS_BOUNDARY_AND_ORIGIN 4 8 8 5 3 with signature: HAS_SIZE 1831271225 246082158 516693645 885371310 -9188024 Generate a random integer with SplittableRandom.nextInt with signature: NONE -897391379 -951196627 737090001 -276183059 1704021189 -849413691 -172179000 -671726879 454421318 -1594567429 with signature: HAS_BOUNDARY 6 9 5 7 7 8 1 4 3 0 with signature: HAS_BOUNDARY_AND_ORIGIN 1 3 7 9 3 0 9 3 5 4 Generate a stream of integers with SplittableRandom.ints with signature: NONE 588209218 441521627 1098193051 1197157131 -494320254 with signature: HAS_BOUNDARY 2 0 7 1 1 with signature: HAS_BOUNDARY_AND_ORIGIN 8 1 7 1 3 with signature: HAS_SIZE -1543455550 -380186012 1606492274 1222040699 -1731352416 Generate a random integer with ThreadLocalRandom.nextInt with signature: NONE -30273511 1846483373 -1498368933 -118921871 -885411060 1857994968 -1324473783 -1369182777 -1765721674 -544309699 with signature: HAS_BOUNDARY 3 4 1 6 7 1 5 9 4 0 with signature: HAS_BOUNDARY_AND_ORIGIN 9 6 0 9 9 7 1 3 5 2 Generate a stream of integers with ThreadLocalRandom.ints with signature: NONE -514365201 899029711 -1145536651 73157318 173374212 with signature: HAS_BOUNDARY 6 8 1 2 5 with signature: HAS_BOUNDARY_AND_ORIGIN 4 1 5 4 0 with signature: HAS_SIZE -1508604967 -514052218 1468970462 -67974228 -1327434922
5. nextInt Java Example – Summary
In this example, I demonstrated how Java provides three utility classes to generate random numbers over time. The JDK8 java.util.SplittableRandom
class is the best class to generate random integers.
6. Download the Source Code
This nextInt Java Example consists of an Eclipse project to generate a random integer and a stream of random integers.
You can download the full source code of this example here: Generate Random Integers – nextInt Java Example
Last updated on Sept. 10, 2019