# within - random number generator java without repetition

## How to generate random integers within a specific range in Java? (20)

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`.
```

As of Java 7, you should no longer use

`Random`

. For most uses, the random number generator of choice is now`ThreadLocalRandom`

.

For fork join pools and parallel streams, use`SplittableRandom`

.

*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]:`

```
int n = new SplittableRandom().nextInt(0, 1_001);
```

To generate a random `int[100]`

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

```
int[] a = new SplittableRandom().ints(100, 0, 1_001).parallel().toArray();
```

To return a Stream of random values:

```
IntStream stream = new SplittableRandom().ints(100, 0, 1_001);
```

Another option is just using Apache Commons:

```
import org.apache.commons.math.random.RandomData;
import org.apache.commons.math.random.RandomDataImpl;
public void method() {
RandomData randomData = new RandomDataImpl();
int number = randomData.nextInt(5, 10);
// ...
}
```

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:

```
Random rn = new Random();
int result = rn.nextInt(max - min + 1) + min;
System.out.println(result);
```

Here is a simple sample that shows how to generate random number from closed `[min, max]`

range, while `min <= max is true`

You can reuse it as field in hole class, also having all `Random.class`

methods in one place

**Results example:**

```
RandomUtils random = new RandomUtils();
random.nextInt(0, 0); // returns 0
random.nextInt(10, 10); // returns 10
random.nextInt(-10, 10); // returns numbers from -10 to 10 (-10, -9....9, 10)
random.nextInt(10, -10); // throws assert
```

**Sources:**

```
import junit.framework.Assert;
import java.util.Random;
public class RandomUtils extends Random {
/**
* @param min generated value. Can't be > then max
* @param max generated value
* @return values in closed range [min, max].
*/
public int nextInt(int min, int max) {
Assert.assertFalse("min can't be > then max; values:[" + min + ", " + max + "]", min > max);
if (min == max) {
return max;
}
return nextInt(max - min + 1) + min;
}
}
```

I found this example Generate random numbers :

This example generates random integers in a specific range.

```
import java.util.Random;
/** Generate random integers in a certain range. */
public final class RandomRange {
public static final void main(String... aArgs){
log("Generating random integers in the range 1..10.");
int START = 1;
int END = 10;
Random random = new Random();
for (int idx = 1; idx <= 10; ++idx){
showRandomInteger(START, END, random);
}
log("Done.");
}
private static void showRandomInteger(int aStart, int aEnd, Random aRandom){
if ( aStart > aEnd ) {
throw new IllegalArgumentException("Start cannot exceed End.");
}
//get the range, casting to long to avoid overflow problems
long range = (long)aEnd - (long)aStart + 1;
// compute a fraction of the range, 0 <= frac < range
long fraction = (long)(range * aRandom.nextDouble());
int randomNumber = (int)(fraction + aStart);
log("Generated : " + randomNumber);
}
private static void log(String aMessage){
System.out.println(aMessage);
}
}
```

An example run of this class :

```
Generating random integers in the range 1..10.
Generated : 9
Generated : 3
Generated : 3
Generated : 9
Generated : 4
Generated : 1
Generated : 3
Generated : 9
Generated : 10
Generated : 10
Done.
```

I wonder if any of the random number generating methods provided by an Apache Commons Math library would fit the bill.

For example: `RandomDataGenerator.nextInt`

or `RandomDataGenerator.nextLong`

In **Java 1.7 or later**, the standard way to do this is as follows:

```
import java.util.concurrent.ThreadLocalRandom;
// nextInt is normally exclusive of the top value,
// so add 1 to make it inclusive
int randomNum = ThreadLocalRandom.current().nextInt(min, max + 1);
```

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:

```
import java.util.Random;
/**
* Returns a pseudo-random number between min and max, inclusive.
* The difference between min and max can be at most
* <code>Integer.MAX_VALUE - 1</code>.
*
* @param min Minimum value
* @param max Maximum value. Must be greater than min.
* @return Integer between min and max, inclusive.
* @see java.util.Random#nextInt(int)
*/
public static int randInt(int min, int max) {
// NOTE: This will (intentionally) not run as written so that folks
// copy-pasting have to think about how to initialize their
// Random instance. Initialization of the Random instance is outside
// the main scope of the question, but some decent options are to have
// a field that is initialized once and then re-used as needed or to
// use ThreadLocalRandom (if using at least Java 1.7).
//
// In particular, do NOT do 'Random rand = new Random()' here or you
// will get not very good / not very random results.
Random rand;
// nextInt is normally exclusive of the top value,
// so add 1 to make it inclusive
int randomNum = rand.nextInt((max - min) + 1) + min;
return randomNum;
}
```

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.

In case of rolling a dice it would be random number between 1 to 6 (not 0 to 6), so:

```
face = 1 + randomNumbers.nextInt(6);
```

Just a small modification of your first solution would suffice.

```
Random rand = new Random();
randomNum = minimum + rand.nextInt((maximum - minimum) + 1);
```

See more here for implementation of `Random`

Just use the Random class:

```
Random ran = new Random();
// Assumes max and min are non-negative.
int randomInt = min + ran.nextInt(max - min + 1);
```

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

approach, https://.com/a/738651/360211

One standard pattern for accomplishing this is:

```
Min + (int)(Math.random() * ((Max - Min) + 1))
```

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.

```
Math.random() * ( Max - Min )
```

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 use

```
Math.random() * 5
```

This 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.

```
Min + (Math.random() * (Max - Min))
```

You now will get a value in the range `[Min,Max)`

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

:

```
5 + (Math.random() * (10 - 5))
```

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:

```
Min + (int)(Math.random() * ((Max - Min) + 1))
```

And there you have it. A random integer value in the range `[Min,Max]`

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

:

```
5 + (int)(Math.random() * ((10 - 5) + 1))
```

The `Math.Random`

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

```
Random rand = new Random();
int x = rand.nextInt(10);
```

`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:

```
String[] i = new String[25];
Random rand = new Random();
int index = 0;
index = rand.nextInt( i.length );
```

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.

```
index = (int) Math.floor(Math.random() * i.length);
```

For a better understanding, check out forum post *Random Intervals (archive.org)*.

ThreadLocalRandom equivalent of class java.util.Random for multithreaded environment. Generating a random number is carried out locally in each of the threads. So we have a better performance by reducing the conflicts.

```
int rand = ThreadLocalRandom.current().nextInt(x,y);
```

x,y - intervals e.g. (1,10)

Use:

```
Random ran = new Random();
int x = ran.nextInt(6) + 5;
```

The integer `x`

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

.

When you need a lot of random numbers, I do not recommend the Random class in the API. It has just a too small period. Try the Mersenne twister instead. There is a Java implementation.

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:

```
Random r = new Random();
int[] fiveRandomNumbers = r.ints(5, 0, 11).toArray();
int randomNumber = r.ints(1, 0, 11).findFirst().getAsInt();
```

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:

```
public final class IntRandomNumberGenerator {
private PrimitiveIterator.OfInt randomIterator;
/**
* Initialize a new random number generator that generates
* random numbers in the range [min, max]
* @param min - the min value (inclusive)
* @param max - the max value (inclusive)
*/
public IntRandomNumberGenerator(int min, int max) {
randomIterator = new Random().ints(min, max + 1).iterator();
}
/**
* Returns a random number in the range (min, max)
* @return a random number in the range (min, max)
*/
public int nextInt() {
return randomIterator.nextInt();
}
}
```

You can also do it for `double`

and `long`

values.

Hope it helps! :)

You can edit your second code example to:

```
Random rn = new Random();
int range = maximum - minimum + 1;
int randomNum = rn.nextInt(range) + minimum;
```

```
rand.nextInt((max+1) - min) + min;
```

```
private static Random random = new Random();
public static int getRandomInt(int min, int max){
return random.nextInt(max - min + 1) + min;
}
```

OR

```
public static int getRandomInt(Random random, int min, int max)
{
return random.nextInt(max - min + 1) + min;
}
```

```
public static Random RANDOM = new Random(System.nanoTime());
public static final float random(final float pMin, final float pMax) {
return pMin + RANDOM.nextFloat() * (pMax - pMin);
}
```