eBook – Guide Spring Cloud – NPI EA (cat=Spring Cloud)
announcement - icon

Let's get started with a Microservice Architecture with Spring Cloud:

>> Join Pro and download the eBook

eBook – Mockito – NPI EA (tag = Mockito)
announcement - icon

Mocking is an essential part of unit testing, and the Mockito library makes it easy to write clean and intuitive unit tests for your Java code.

Get started with mocking and improve your application tests using our Mockito guide:

Download the eBook

eBook – Java Concurrency – NPI EA (cat=Java Concurrency)
announcement - icon

Handling concurrency in an application can be a tricky process with many potential pitfalls. A solid grasp of the fundamentals will go a long way to help minimize these issues.

Get started with understanding multi-threaded applications with our Java Concurrency guide:

>> Download the eBook

eBook – Reactive – NPI EA (cat=Reactive)
announcement - icon

Spring 5 added support for reactive programming with the Spring WebFlux module, which has been improved upon ever since. Get started with the Reactor project basics and reactive programming in Spring Boot:

>> Join Pro and download the eBook

eBook – Java Streams – NPI EA (cat=Java Streams)
announcement - icon

Since its introduction in Java 8, the Stream API has become a staple of Java development. The basic operations like iterating, filtering, mapping sequences of elements are deceptively simple to use.

But these can also be overused and fall into some common pitfalls.

To get a better understanding on how Streams work and how to combine them with other language features, check out our guide to Java Streams:

>> Join Pro and download the eBook

eBook – Jackson – NPI EA (cat=Jackson)
announcement - icon

Do JSON right with Jackson

Download the E-book

eBook – HTTP Client – NPI EA (cat=Http Client-Side)
announcement - icon

Get the most out of the Apache HTTP Client

Download the E-book

eBook – Maven – NPI EA (cat = Maven)
announcement - icon

Get Started with Apache Maven:

Download the E-book

eBook – Persistence – NPI EA (cat=Persistence)
announcement - icon

Working on getting your persistence layer right with Spring?

Explore the eBook

eBook – RwS – NPI EA (cat=Spring MVC)
announcement - icon

Building a REST API with Spring?

Download the E-book

Course – LS – NPI EA (cat=Jackson)
announcement - icon

Get started with Spring and Spring Boot, through the Learn Spring course:

>> LEARN SPRING
Course – RWSB – NPI EA (cat=REST)
announcement - icon

Explore Spring Boot 3 and Spring 6 in-depth through building a full REST API with the framework:

>> The New “REST With Spring Boot”

Course – LSS – NPI EA (cat=Spring Security)
announcement - icon

Yes, Spring Security can be complex, from the more advanced functionality within the Core to the deep OAuth support in the framework.

I built the security material as two full courses - Core and OAuth, to get practical with these more complex scenarios. We explore when and how to use each feature and code through it on the backing project.

You can explore the course here:

>> Learn Spring Security

Course – LSD – NPI EA (tag=Spring Data JPA)
announcement - icon

Spring Data JPA is a great way to handle the complexity of JPA with the powerful simplicity of Spring Boot.

Get started with Spring Data JPA through the guided reference course:

>> CHECK OUT THE COURSE

Partner – Moderne – NPI EA (cat=Spring Boot)
announcement - icon

Refactor Java code safely — and automatically — with OpenRewrite.

Refactoring big codebases by hand is slow, risky, and easy to put off. That’s where OpenRewrite comes in. The open-source framework for large-scale, automated code transformations helps teams modernize safely and consistently.

Each month, the creators and maintainers of OpenRewrite at Moderne run live, hands-on training sessions — one for newcomers and one for experienced users. You’ll see how recipes work, how to apply them across projects, and how to modernize code with confidence.

Join the next session, bring your questions, and learn how to automate the kind of work that usually eats your sprint time.

Course – LJB – NPI EA (cat = Core Java)
announcement - icon

Code your way through and build up a solid, practical foundation of Java:

>> Learn Java Basics

Partner – LambdaTest – NPI EA (cat= Testing)
announcement - icon

Distributed systems often come with complex challenges such as service-to-service communication, state management, asynchronous messaging, security, and more.

Dapr (Distributed Application Runtime) provides a set of APIs and building blocks to address these challenges, abstracting away infrastructure so we can focus on business logic.

In this tutorial, we'll focus on Dapr's pub/sub API for message brokering. Using its Spring Boot integration, we'll simplify the creation of a loosely coupled, portable, and easily testable pub/sub messaging system:

>> Flexible Pub/Sub Messaging With Spring Boot and Dapr

1. Overview

In this tutorial, we’ll explore different ways of generating random numbers within a range.

Further reading:

Generating Random Numbers in Java

Learn different ways of generating random numbers in Java.

Java - Random Long, Float, Integer and Double

Learn how to generate random numbers in Java - both unbounded as well as within a given interval.

Java - Generate Random String

Generate Bounded and Unbounded Random Strings using plain Java and the Apache Commons Lang library.

2. Generating Random Numbers in a Range

2.1. Math.random

Math.random gives a random double value that is greater than or equal to 0.0 and less than 1.0.

Let’s use the Math.random method to generate a random number in a given range [min, max):

public int getRandomNumber(int min, int max) {
    return (int) ((Math.random() * (max - min)) + min);
}

Why does that work? Let’s look at what happens when Math.random returns 0.0, which is the lowest possible output:

0.0 * (max - min) + min => min

So, the lowest number we can get is min.

Since 1.0 is the exclusive upper bound of Math.random, this is what we get:

1.0 * (max - min) + min => max - min + min => max

Therefore, the exclusive upper bound of our method’s return is max.

In the next section, we’ll see this same pattern repeated with Random#nextInt.

2.2. java.util.Random.nextInt

We can also use an instance of java.util.Random to do the same.

Let’s make use of the java.util.Random.nextInt method to get a random number:

public int getRandomNumberUsingNextInt(int min, int max) {
    Random random = new Random();
    return random.nextInt(max - min) + min;
}

The min parameter (the origin) is inclusive, whereas the upper bound max is exclusive.

2.3. java.util.Random.ints

The java.util.Random.ints method returns an IntStream of random integers.

So, we can utilize the java.util.Random.ints method and return a random number:

public int getRandomNumberUsingInts(int min, int max) {
    Random random = new Random();
    return random.ints(min, max)
      .findFirst()
      .getAsInt();
}

Here as well, the specified origin min is inclusive, and max is exclusive.

2.4. java.util.concurrent.ThreadLocalRandom

The ThreadLocalRandom class is part of the java.util.concurrent package, and it’s optimized for use in multithreaded environments. It offers improved performance in concurrent programs by eliminating thread contention, making it more efficient than Random in multi-threaded environments.

Let’s use ThreadLocalRandom to generate a random integer within a specific range:

int getRandomNumberUsingThreadLocalRandom(int min, int max) {
    return ThreadLocalRandom.current().nextInt(min, max);
}

In this method, the min value is inclusive, and the max value is exclusive, similar to the behavior of Random.nextInt().

Using ThreadLocalRandom is advantageous when multiple threads need to generate random numbers simultaneously, as it avoids contention and delivers thread-local instances of random number generators.

3. Generating Random Numbers in a Range With Some Exclusions

We can also generate a random number within a specified range while excluding certain values.

3.1. Math.random()

Let’s use Math.random() to generate a random number within a specified range while excluding some values:

static int getRandomWithExclusionUsingMathRandom(int min, int max, int [] exclude) {
    Arrays.sort(exclude);
    int random = min + (int) ((max - min + 1 - exclude.length) * Math.random());
    for (int ex : exclude) {
        if (random < ex) {
            break;
        }
        random++;
    }
    return random;
}

In the code above, we add an array of integers to the method argument.  The exclude array contains integer values that should be excluded from the random number generation.

Furthermore, we sort the array in ascending order to optimize the loop. By sorting the array, we ensure that once we’ve found an excluded number greater than the random number, we won’t find any more and break the loop early. If the array isn’t sorted, the loop might break prematurely.

Let’s take a moment to understand how the algorithm works to ensure that incremented random value isn’t in the exclude array. We can assume we have an array containing values we’re excluding and a random number:

int[] exclude = {2, 3, 5};
int random = 3;

Next, let’s iterate through the array and compare it with the random number:

for (int ex : exclude) {
    if (random < ex) {
        break;
    }
    random++;
}
return random;

Firstly, the algorithm begins by comparing the random value with the first element in the exclude array. Since the random value isn’t less than the first element in the array, the loop continues and increments the random number to 4.

Next, the loop then moves to the next element, which is 3. As the random number isn’t less than 3, the loop continues, incrementing the random number to 5.

Furthermore, the next value in the array is 5, which is equal to the random number. The loop increments the random number to 6 and then stops as we’ve reached the end of the array. Therefore, the returned random number is 6.

Notably, if the random value is less than any element in the array, the loop will break and return the current random value.

In the next section, we’ll use java.util.Random.nextInt() method to generate a random number within a specified range while excluding certain values, applying the same algorithm.

3.2. java.util.Random.nextInt()

In a previous section, we saw how to use java.util.Random.nextInt() to generate a random number within a specified range. Let’s broaden the method by implementing the functionality to exclude some numbers:

static int getRandomNumberWithExclusionUsingNextInt(int min, int max, int [] exclude) {
    Random rnd = new Random();
    Arrays.sort(exclude);
    int random = min + rnd.nextInt(max - min + 1 - exclude.length);
        for (int ex : exclude) {
            if (random < ex) {
                break;
            }
            random++;
        }
    return random;
}

Here, we create a new instance of Random and invoke the nextInt() method on it to generate a random number within a specific range with some exclusions.

3.3. java.util.Random.ints()

We can also generate a random number while excluding some values using the java.util.Random.ints() method:

int getRandomWithExclusion(int min, int max, int [] exclude) {
    Random rnd = new Random();
    OptionalInt random = rnd.ints(min, max + 1)
      .filter(num -> Arrays.stream(exclude).noneMatch(ex -> num == ex))
      .findFirst();
    return random.orElse(start);
}

The code above generates a stream of random integers within the specified range. We then use the filter() method of the Stream API to eliminate numbers in the exclude array.

Finally, we use the findFirst() method to get a number in the stream that’s not in the exclude array.

4. Conclusion

In this article, we saw alternative ways of generating random numbers within a range.

The code backing this article is available on GitHub. Once you're logged in as a Baeldung Pro Member, start learning and coding on the project.
Baeldung Pro – NPI EA (cat = Baeldung)
announcement - icon

Baeldung Pro comes with both absolutely No-Ads as well as finally with Dark Mode, for a clean learning experience:

>> Explore a clean Baeldung

Once the early-adopter seats are all used, the price will go up and stay at $33/year.

eBook – HTTP Client – NPI EA (cat=HTTP Client-Side)
announcement - icon

The Apache HTTP Client is a very robust library, suitable for both simple and advanced use cases when testing HTTP endpoints. Check out our guide covering basic request and response handling, as well as security, cookies, timeouts, and more:

>> Download the eBook

eBook – Java Concurrency – NPI EA (cat=Java Concurrency)
announcement - icon

Handling concurrency in an application can be a tricky process with many potential pitfalls. A solid grasp of the fundamentals will go a long way to help minimize these issues.

Get started with understanding multi-threaded applications with our Java Concurrency guide:

>> Download the eBook

eBook – Java Streams – NPI EA (cat=Java Streams)
announcement - icon

Since its introduction in Java 8, the Stream API has become a staple of Java development. The basic operations like iterating, filtering, mapping sequences of elements are deceptively simple to use.

But these can also be overused and fall into some common pitfalls.

To get a better understanding on how Streams work and how to combine them with other language features, check out our guide to Java Streams:

>> Join Pro and download the eBook

eBook – Persistence – NPI EA (cat=Persistence)
announcement - icon

Working on getting your persistence layer right with Spring?

Explore the eBook

Course – LS – NPI EA (cat=REST)

announcement - icon

Get started with Spring Boot and with core Spring, through the Learn Spring course:

>> CHECK OUT THE COURSE

Partner – Moderne – NPI EA (tag=Refactoring)
announcement - icon

Modern Java teams move fast — but codebases don’t always keep up. Frameworks change, dependencies drift, and tech debt builds until it starts to drag on delivery. OpenRewrite was built to fix that: an open-source refactoring engine that automates repetitive code changes while keeping developer intent intact.

The monthly training series, led by the creators and maintainers of OpenRewrite at Moderne, walks through real-world migrations and modernization patterns. Whether you’re new to recipes or ready to write your own, you’ll learn practical ways to refactor safely and at scale.

If you’ve ever wished refactoring felt as natural — and as fast — as writing code, this is a good place to start.

eBook Jackson – NPI EA – 3 (cat = Jackson)