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 efficiently iterate over each entry in a Java Map?

**2008-09-05 21:12:48****iMack****2323170**View**3018**Score**40**Answer- Tags: java dictionary collections iteration

#### 18 Answered Questions

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

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

#### 58 Answered Questions

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

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

#### 18 Answered Questions

#### 29 Answered Questions

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

**2009-10-06 20:05:41****zacharyliu****1130744**View**1761**Score**29**Answer- Tags: javascript random integer

#### 65 Answered Questions

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

**2009-08-28 21:14:41****Tom Lehman****1138777**View**1508**Score**65**Answer- Tags: javascript random

#### 2 Answered Questions

#### 29 Answered Questions

#### 43 Answered Questions

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

**2011-04-07 18:27:54****Unknown user****5723018**View**2828**Score**43**Answer- Tags: java string int type-conversion

#### 40 Answered Questions

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

**2008-09-03 02:58:43****Todd****1322671**View**1635**Score**40**Answer- Tags: java string random alphanumeric

## 30 comments

## @Simon 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.## @Kaplan 2019-07-06 09:02:40

here's a function that returns exactly one integer random number in a range defined by`lowerBoundIncluded`

and`upperBoundIncluded`

, as requested byuser42155`SplittableRandom splittableRandom = new SplittableRandom();`

`randomInt.apply( …, … ); // gets the random number`

…or shorter for the one-time generation of a random number## @Abel Callejo 2013-09-01 02:53:53

It can be done by simply doing the statement:

Below is its source-code

## Randomizer.java

It is just clean and simple.

## @Maarten Bodewes 2017-06-19 21:23:47

This could have been an edit of the other example, now it is just a blatant copy for reputation. Pointing out the "answer with the most votes" is also not very direct, it can change.

## @Abel Callejo 2017-06-20 00:36:07

That is right @MaartenBodewes. When I wrote this answer, the answer with the most votes above was still written as an algorithm-like solution. Now, the solution above has changed a lot and now this answer looked like a copy-cat.

## @anshul 2019-05-13 09:04:30

Following code could be used:

## @Maarten Bodewes 2019-07-01 11:28:27

There have been multiple answers that already suggested

`ThreadLocalRandom`

. If a question has been protected then please take extra care not to duplicate answers.## @Arth Tyagi 2019-02-12 11:30:17

Use

`math.random()`

and set the requirements in the if statement. The easiest, simplest and fastest approach## @Ṁữŀlɪgắnậcễơưṩ ᛗ 2019-02-15 21:39:25

math.random() generates floating point numbers.

## @Arth Tyagi 2019-03-28 18:54:44

how about type casting?

## @klemen kobau 2019-05-31 14:41:10

@ArthTyagi math.random() generates values from 0 to excluding 1. So typecasting should allways give 0. This answer should be deleted, as it is wrong. Also I beleive it's Math.random().

## @AZ_ 2011-07-13 11:31:55

## @Prof Mo 2013-12-24 13:33:13

Just use the Random class:

## @Maarten Bodewes 2017-06-19 21:21:53

I don't see anything new here that hadn't been posted in countless earlier posts.

## @gifpif 2015-05-27 10:43:08

Generate a random number for the difference of min and max by using the nextint(n) method and then add min number to the result:

## @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.

## @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?## @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.## @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 :

## @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`

!## @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.## @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 ;)## @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);`

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

Use:

The integer

`x`

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

.## @Mulalo Madida 2017-06-20 12:39:17

You can achieve that concisely in Java 8:

## @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...## @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

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

## @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();

## @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'.

## @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.

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

Making the following change in

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

## @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.

## @user10253771 2019-01-23 01:03:57

This doesn't look right. In "int n = (max + 1 - min) + min; return (int) (Math.random() * n);" , n = max + 1, and you are just creating an int in [0, max] instead of [min, max]. It should be "int n = max + 1 - min; return (int) (Math.random() * n) + min;"

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

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

An explanation would be in order.

## @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.

## @Bill the Lizard 2008-12-12 18:31:28

You can edit your second code example to:

## @Oleksandr Pyrohov 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 Pyrohov 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.