2008-12-12 18:20:57 8 Comments

How do I generate a random `int`

value in a specific range?

I have tried the following, but those do not work:

**Attempt 1:**

```
randomNum = minimum + (int)(Math.random() * maximum);
// Bug: `randomNum` can be bigger than `maximum`.
```

**Attempt 2:**

```
Random rn = new Random();
int n = maximum - minimum + 1;
int i = rn.nextInt() % n;
randomNum = minimum + i;
// Bug: `randomNum` can be smaller than `minimum`.
```

### Related Questions

#### Sponsored Content

#### 40 Answered Questions

### [SOLVED] How do I convert a String to an int in Java?

**2011-04-07 18:27:54****Unknown user****5509472**View**2701**Score**40**Answer- Tags: java string int type-conversion

#### 58 Answered Questions

### [SOLVED] How do I read / convert an InputStream into a String in Java?

**2008-11-21 16:47:40****Johnny Maelstrom****1838297**View**3480**Score**58**Answer- Tags: java string io stream inputstream

#### 60 Answered Questions

### [SOLVED] Generate random string/characters in JavaScript

**2009-08-28 21:14:41****Tom Lehman****952162**View**1312**Score**60**Answer- Tags: javascript random

#### 38 Answered Questions

### [SOLVED] How do I efficiently iterate over each entry in a Java Map?

**2008-09-05 21:12:48****iMack****2145851**View**2761**Score**38**Answer- Tags: java dictionary collections iteration

#### 21 Answered Questions

#### 26 Answered Questions

### [SOLVED] Generating random whole numbers in JavaScript in a specific range?

**2009-10-06 20:05:41****zacharyliu****1015349**View**1620**Score**26**Answer- Tags: javascript random integer

#### 28 Answered Questions

#### 43 Answered Questions

### [SOLVED] How to generate a random alpha-numeric string?

**2008-09-03 02:58:43****Todd****1265243**View**1548**Score**43**Answer- Tags: java string random alphanumeric

#### 2 Answered Questions

#### 18 Answered Questions

### [SOLVED] Generate random number between two numbers in JavaScript

**2011-02-10 16:41:22****Mirgorod****1112831**View**1384**Score**18**Answer- Tags: javascript random

## 30 comments

## @Lawakush Kurmi 2017-11-02 06:38:07

To generate a random number "in between two numbers", use the following code:

This gives you a random number in between 1 (inclusive) and 11 (exclusive), so initialize the upperBound value by adding 1. For example, if you want to generate random number between 1 to 10 then initialize the upperBound number with 11 instead of 10.

## @namezhouyu 2017-10-09 08:48:28

## @Peter Mortensen 2019-01-05 10:21:20

An explanation would be in order.

## @Simo 2017-05-28 14:30:49

I use this:

You can cast it to an Integer if you want.

## @sokras 2017-07-20 07:38:51

This function produces the same number over and over again. In my case it was: 2147483647

## @Maarten Bodewes 2018-04-23 21:26:54

Fail: you have a function that requires a double and then perform + 1? This certainly goes against the principle of least surprise. What happens if you use min = 0.1 and max = 0.2?

## @Maarten Bodewes 2018-04-23 21:36:31

@sokras the method calls

`new Random`

(check the JavaDoc): "Creates a new random number generator. This constructor sets the seed of the random number generator to a value very likely to be distinct from any other invocation of this constructor." Very likely might just involve using the current time as seed. If that time uses milliseconds then current computers are fast enough to generate the same number. But besides that 2147483647 is`Integer.MAX_VALUE`

; the output obviously depends on the input, which you haven't specified.## @Siddhartha Thota 2018-02-25 20:26:34

Say you want range between 0-9, 0 is minimum and 9 is maximum. The below function will print anything between 0 and 9. It's the same for all ranges.

## @monster 2018-08-14 12:25:54

Making the following change in

Attempt 1should do the work -Check this for working code.

## @Prakhar Nigam 2018-11-17 07:46:35

Use java.util for Random for general use.

You can define your minimum and maximum range to get those results.

## @Anjali Pavithra 2019-01-01 09:39:04

Below is a sample class which shows how to generate random integers within a specific range. Assign any value you want as the maximum value to the variable 'max' and assign any value you want as the minimum value to the variable 'min'.

## @user2427 2008-12-12 18:28:35

Or take a look to RandomUtils from Apache Commons.

## @zakmck 2015-01-30 09:27:17

That's useful, but beware a small flaw: method signatures are like: nextDouble(double startInclusive, double endInclusive), but if you look inside the methods, endInclusive should actually be endExclusive.

## @Holger 2016-06-03 09:47:15

`Double.valueOf(Math.random()*(maximum-minimun)).intValue()`

is quite an obfuscated (and inefficient) way to say`(int)(Math.random()*(maximum-minimun))`

…## @Hrishikesh Mishra 2016-12-26 05:14:23

Spelling mismatch for minimum return minimum + Double.valueOf(Math.random() * (maximum - minimum)).intValue();

## @Greg Case 2008-12-12 18:25:27

In

Java 1.7 or later, the standard way to do this is as follows:See the relevant JavaDoc. This approach has the advantage of not needing to explicitly initialize a java.util.Random instance, which can be a source of confusion and error if used inappropriately.

However, conversely there is no way to explicitly set the seed so it can be difficult to reproduce results in situations where that is useful such as testing or saving game states or similar. In those situations, the pre-Java 1.7 technique shown below can be used.

Before Java 1.7, the standard way to do this is as follows:See the relevant JavaDoc. In practice, the java.util.Random class is often preferable to java.lang.Math.random().

In particular, there is no need to reinvent the random integer generation wheel when there is a straightforward API within the standard library to accomplish the task.

## @Daniel 2014-08-12 10:34:30

For calls where

`max`

value is`Integer.MAX_VALUE`

it is possible to overflow ,resulting into a`java.lang.IllegalArgumentException`

. You can try with :`randInt(0, Integer.MAX_VALUE)`

. Also, if`nextInt((max-min) + 1)`

returns the most high value (quite rare, I assume) won't it overflow again( supposing min and max are high enough values)? How to deal with this kind of situations?## @momo 2015-02-23 06:26:46

This doesn't work for longs

## @Moishe Lipsker 2015-06-17 17:18:28

@momo the

`RANDOM`

class supports`nextLong`

. You could use that instead of`nextInt`

for longs.## @momo 2015-06-17 18:42:57

@MoisheLipsker It must be that nextLong doesn't take a bound as nextInteger

## @b1nary.atr0phy 2015-08-18 01:01:28

@momo Enlist help from the

`double`

. Just so:`long val = ((long) (r.nextDouble() * (max - min))) + min`

## @momo 2015-08-18 12:01:45

Yes, I already do that, using the Math.random() which does that: public static long random(long min, long max) { return min + Math.round( Math.random() * ( (max - min) ) ); }

## @leventov 2015-09-04 09:07:16

This snippet (that probably thousands of people copy) is BAD. It produce garbage. Just

`ThreadLocalRandom.current().nextInt(min, max)`

.## @Greg Case 2015-09-11 01:57:18

@leventov

`ThreadLocalRandom`

was added to Java 2 1/2 years after this question was first asked. I've always been of the firm opinion that management of the Random instance is outside the scope of the question.## @Greg Case 2015-10-12 04:51:35

@AbhishekSingh The comments try to address this, but in more detail: nextInt(N) returns a number from 0 to N - 1, i.e. it will never return N as a result. In this case we want to include N in our possible range of values, so we add one: nextInt(N+1) => returns a number in the range 0 to N, inclusive of both 0 and N

## @Lakatos Gyula 2016-04-14 20:20:24

Good luck testing classes that uses the ThreadLocalRandom.

## @Webserveis 2016-10-03 19:55:05

In Android Random rand = new Random();

## @Greg Case 2016-10-04 00:29:17

@Webserveis This is addressed in the comments in the example. Short version - you should not = new Random() for every call to the function, or your results will not be sufficiently random for many cases.

## @Chit Khine 2017-03-07 08:02:38

Shouldn't you initialize the rand = new Random()?

## @Greg Case 2017-03-13 03:09:44

@ChitKhine Not on each call to the function. The RNG algorithm under the hood of Random works well (enough for non-cryptographic applications) when generating successive random numbers. However, if the Random instance is re-created on each call, that means that instead of a proper RNG you're going to get "random" numbers based on whatever seed is chosen each time - often this is based on the system clock. This can give decidedly non-random results. Instead, you should consider instantiating your Random instance outside of method scope. The example code attempts to address this.

## @user5365075 2018-02-20 13:04:55

Use

`ThreadLocalRandom.current().nextBytes(chunk);`

if you want to save yourself the`new Random()`

. Thanks to a really popular question on generating random Integers in Java.## @Aman 2018-11-14 13:19:40

and if you're using for android java ThreadLocalRandom.current().nextInt(1, 100) it requires min API Level 21

## @Alekya 2018-08-22 06:46:32

## @TJ_Fischer 2008-12-12 18:35:49

Note that this approach is more biased and less efficient than a

`nextInt`

approach, https://stackoverflow.com/a/738651/360211One standard pattern for accomplishing this is:

The Java Math library function Math.random() generates a double value in the range

`[0,1)`

. Notice this range does not include the 1.In order to get a specific range of values first, you need to multiply by the magnitude of the range of values you want covered.

This returns a value in the range

`[0,Max-Min)`

, where 'Max-Min' is not included.For example, if you want

`[5,10)`

, you need to cover five integer values so you useThis would return a value in the range

`[0,5)`

, where 5 is not included.Now you need to shift this range up to the range that you are targeting. You do this by adding the Min value.

You now will get a value in the range

`[Min,Max)`

. Following our example, that means`[5,10)`

:But, this still doesn't include

`Max`

and you are getting a double value. In order to get the`Max`

value included, you need to add 1 to your range parameter`(Max - Min)`

and then truncate the decimal part by casting to an int. This is accomplished via:And there you have it. A random integer value in the range

`[Min,Max]`

, or per the example`[5,10]`

:## @Lilian A. Moraru 2012-02-23 23:26:34

The Sun documentation explicitly says that you should better use Random() if you need an int instead of Math.random() which produces a double.

## @weston 2016-12-29 13:35:53

This is actually biased compared to nextInt methods stackoverflow.com/a/738651/360211

## @vaquar khan 2018-05-31 15:16:34

## @Peter Mortensen 2019-01-05 10:18:53

An explanation would be in order.

## @Sanjeev Singh 2018-05-23 15:24:13

The following is another example using Random and forEach

## @Oleksandr 2018-04-11 21:54:39

Joshua Bloch. Effective Java. Third Edition.## Starting from Java 8

For fork join pools and parallel streams, use

`SplittableRandom`

that is usually faster, has a better statistical independence and uniformity properties in comparison with`Random`

.To generate a random

`int`

in the range`[0, 1_000]:`

To generate a random

`int[100]`

array of values in the range`[0, 1_000]:`

To return a Stream of random values:

## @Johnbot 2018-07-20 06:29:12

Is there a reason why the example includes a

`.parallel()`

? It seems to me like generating a 100 random numbers would be too trivial to warrant parallelism.## @Oleksandr 2018-07-20 08:35:20

@Johnbot Thanks for comment, you are right. But, the main reason was to show an API (of course, the smart path is to measure performance before using

`parallel`

processing). By the way, for array of`1_000_000`

elements, the`parallel`

version was 2 times faster on my machine in comparison with sequential.## @Sunil Chawla 2014-08-03 03:07:54

Let us take an example.

Suppose I wish to generate a number between

5-10:Let us understand this...## @Mulalo Madida 2017-06-20 12:39:17

You can achieve that concisely in Java 8:

## @gerardw 2012-01-18 16:15:15

Another option is just using Apache Commons:

## @Joel Sjöstrand 2011-01-10 13:19:59

Forgive me for being fastidious, but the solution suggested by the majority, i.e.,

`min + rng.nextInt(max - min + 1))`

, seems perilous due to the fact that:`rng.nextInt(n)`

cannot reach`Integer.MAX_VALUE`

.`(max - min)`

may cause overflow when`min`

is negative.A foolproof solution would return correct results for any

`min <= max`

within [`Integer.MIN_VALUE`

,`Integer.MAX_VALUE`

]. Consider the following naive implementation:Although inefficient, note that the probability of success in the

`while`

loop will always be 50% or higher.## @mpkorstanje 2015-01-09 10:27:57

Why not throw an IllegalArgumentException when the difference = Integer.MAX_VALUE? Then you don't need the while loop.

## @Christian Semrau 2015-05-06 19:27:30

@mpkorstanje This implementation is designed to work with any values of min <= max, even when their difference is equal to or even larger than MAX_VALUE. Running a loop until success is a common pattern in this case, to guarantee uniform distribution (if the underlying source of randomness is uniform). Random.nextInt(int) does it internally when the argument is not a power of 2.

## @mpkorstanje 2015-05-07 10:36:57

Thanks for the explanation! Makes sense as the expected number of iterations is 2.

## @jackson 2009-09-04 04:23:27

Use:

The integer

`x`

is now the random number that has a possible outcome of`5-10`

.## @Matt R 2009-01-08 15:04:42

The

`Math.Random`

class in Java is 0-based. So, if you write something like this:`x`

will be between`0-9`

inclusive.So, given the following array of

`25`

items, the code to generate a random number between`0`

(the base of the array) and`array.length`

would be:Since

`i.length`

will return`25`

, the`nextInt( i.length )`

will return a number between the range of`0-24`

. The other option is going with`Math.Random`

which works in the same way.For a better understanding, check out forum post

Random Intervals (archive.org).## @Tapper7 2016-10-30 05:44:57

+1 for wayBackMachine archive screenshot link & your answer is still useful reference to get "random" ints w/in a range.

## @AjahnCharles 2017-08-02 13:53:53

It baffles me why you instantiate index to 0.

## @Matt R 2017-08-02 14:38:52

@CodeConfident The

`index`

variable will not affect the result of the random number. You can choose to initialize it any way you would like without having to worry about changing the outcome. Hope this helps.## @AjahnCharles 2017-08-02 14:41:09

Exactly... it's completely unused. I would initialise it directly to the rand:

`int index = rand.nextInt(i.Length);`

## @hexabunny 2015-03-12 22:44:28

Just a small modification of your first solution would suffice.

See more here for implementation of

`Random`

## @AxelH 2016-07-08 12:30:15

For minimum <= value < maximum, I did the same with Math :

randomNum = minimum + (int)(Math.random() * (maximum-minimum));but the casting isn't really nice to see ;)## @BMAM 2018-02-01 04:54:58

The below code generates a random number between 100,000 and 900,000. This code will generate six digit values. I'm using this code to generate a six-digit OTP.

Use

`import java.util.Random`

to use this random method.## @jatin3893 2012-10-27 08:17:26

I just generate a random number using Math.random() and multiply it by a big number, let's say 10000. So, I get a number between 0 to 10,000 and call this number

`i`

. Now, if I need numbers between (x, y), then do the following:So, all

`i`

's are numbers between x and y.To remove the bias as pointed out in the comments, rather than multiplying it by 10000 (or the big number), multiply it by (y-x).

## @Luke Taylor 2012-08-12 15:01:37

This methods might be convenient to use:

This method will return a random number

the provided min and max value:betweenand this method will return a random number

the provided min and max value (so the generated number could also be the min or max number):from## @Maarten Bodewes 2017-03-01 21:26:35

`// Since the random number is between the min and max values, simply add 1`

. Why? Doesn't min count? Usually the range is [min, max) where min is included and max is excluded. Wrong answer, voted down.## @Luke Taylor 2017-03-02 09:53:53

@MaartenBodewes +1 is added because getRandomNumberBetween generates a random number exclusive of the provided endpoints.

## @Lii 2018-06-17 12:21:50

The number

`min + 1`

will be twice as likely than the other number to be the result of`getRandomNumberBetween`

!## @Hospes 2012-06-07 10:38:41

I found this example Generate random numbers :

This example generates random integers in a specific range.

An example run of this class :

## @Michael Myers 2008-12-12 18:25:39

## @ledlogic 2017-12-01 23:01:47

There is a library at https://sourceforge.net/projects/stochunit/ for handling selection of ranges.

It has edge inclusion/preclusion.

## @Sam2016 2017-10-04 14:18:05

A simple way to generate n random numbers between a and b e.g a =90, b=100, n =20

`r.ints()`

returns an`IntStream`

and has several useful methods, have look at its API.## @Alexis C. 2014-11-26 18:29:07

With java-8 they introduced the method

`ints(int randomNumberOrigin, int randomNumberBound)`

in the`Random`

class.For example if you want to generate five random integers (or a single one) in the range [0, 10], just do:

The first parameter indicates just the size of the

`IntStream`

generated (which is the overloaded method of the one that produces an unlimited`IntStream`

).If you need to do multiple separate calls, you can create an infinite primitive iterator from the stream:

You can also do it for

`double`

and`long`

values.Hope it helps! :)

## @Naxos84 2018-02-26 07:13:43

I would suggest that you instantiate the randomIterator only once. See Greg Case comment on his own answer.

## @Erfan Ahmed 2018-04-10 10:39:40

if you may, can you explain what is the significance of

`streamSize`

- the first param of this method given`streamSize !=0`

. What is the difference if`streamSize`

1/2/n is given?## @cen 2018-05-11 12:31:06

Sweet solution, especially the stream class.

## @Gihan Chathuranga 2017-08-12 14:10:39

This is the easy way to do this.

In there 5 is the starting point of random numbers. 6 is the range including number 5.