51

What method returns a random int between a min and max? Or does no such method exist?

What I'm looking for is something like this:

NAMEOFMETHOD (min, max) 

(where min and max are ints), that returns something like this:

8 

(randomly)

If such a method does exist could you please link to the relevant documentation with your answer.

Thanks.


UPDATE

Attempting to implement the full solution and I get the following error message:

class TestR { public static void main (String[]arg) { Random random = new Random() ; int randomNumber = random.nextInt(5) + 2; System.out.println (randomNumber) ; } } 

I'm still getting the same errors from the compiler:

TestR.java:5: cannot find symbol symbol : class Random location: class TestR Random random = new Random() ; ^ TestR.java:5: cannot find symbol symbol : class Random location: class TestR Random random = new Random() ; ^ TestR.java:6: operator + cannot be applied to Random.nextInt,int int randomNumber = random.nextInt(5) + 2; ^ TestR.java:6: incompatible types found : <nulltype> required: int int randomNumber = random.nextInt(5) + 2; ^ 4 errors 


What's going wrong here?

3
  • Did you forget to declare random and assign a new instance of java.util.Random to it?
    – MAK
    CommentedMar 14, 2010 at 22:48
  • could you explain how to do that?
    – David
    CommentedMar 14, 2010 at 23:02
  • Did you declare import statements for java.util.Random
    – Batakj
    CommentedNov 22, 2012 at 10:12

8 Answers 8

147

Construct a Random object at application startup:

Random random = new Random(); 

Then use Random.nextInt(int):

int randomNumber = random.nextInt(max + 1 - min) + min; 

Note that the both lower and upper limits are inclusive.

12
  • i updated the question with the error that occurs when i try to do that what is going wrong?
    – David
    CommentedMar 14, 2010 at 22:44
  • 2
    David, you need to instantiate it first. Random random = new Random(); It's still just Java code. There's no means of magic ;)
    – BalusC
    CommentedMar 14, 2010 at 22:49
  • 2
    And make sure that you only instantiate the Random object once and reuse it. Don't create a new Random object for each call to your function.CommentedMar 14, 2010 at 22:50
  • 4
    You are missing import java.util.Random;.CommentedMar 14, 2010 at 23:23
  • 1
    @ataulm: In older versions of Java creating multiple Random objects didn't guarantee randomness. "Two Random objects created within the same millisecond will have the same sequence of random numbers." (source). In newer versions it is probably OK, but I didn't know that when I wrote my comment three years ago.CommentedJul 29, 2013 at 9:00
19

You can use Random.nextInt(n). This returns a random int in [0,n). Just using max-min+1 in place of n and adding min to the answer will give a value in the desired range.

1
  • i updated the question with the error that occurs when i try to do that what is going wrong?
    – David
    CommentedMar 14, 2010 at 22:45
10
public static int random_int(int Min, int Max) { return (int) (Math.random()*(Max-Min))+Min; } random_int(5, 9); // For example 
3
  • Your algorithm is Random x * positive number + positive number. How can this always result in a number between max and min?
    – Ruben
    CommentedJun 30, 2014 at 11:27
  • 2
    Random is between 0 and 1. Do the math.CommentedSep 17, 2015 at 1:00
  • 2
    Be aware that the lower limit is inclusive but the upper limit is exclusive in this answer. If you wants both to be inclusive use: return (int) (Math.random()*(Max-Min + 1))+Min;
    – Synn
    CommentedJan 7, 2018 at 17:34
4

With Java 7 or above you could use

ThreadLocalRandom.current().nextInt(int origin, int bound) 

Javadoc: ThreadLocalRandom.nextInt

    4

    As the solutions above do not consider the possible overflow of doing max-min when min is negative, here another solution (similar to the one of kerouac)

    public static int getRandom(int min, int max) { if (min > max) { throw new IllegalArgumentException("Min " + min + " greater than max " + max); } return (int) ( (long) min + Math.random() * ((long)max - min + 1)); } 

    this works even if you call it with:

    getRandom(Integer.MIN_VALUE, Integer.MAX_VALUE) 
      1

      Using the Random class is the way to go as suggested in the accepted answer, but here is a less straight-forward correct way of doing it if you didn't want to create a new Random object :

      min + (int) (Math.random() * (max - min + 1)); 
        -3

        This generates a random integer of size psize

        public static Integer getRandom(Integer pSize) { if(pSize<=0) { return null; } Double min_d = Math.pow(10, pSize.doubleValue()-1D); Double max_d = (Math.pow(10, (pSize).doubleValue()))-1D; int min = min_d.intValue(); int max = max_d.intValue(); return RAND.nextInt(max-min) + min; } 
        1
        • 2
          That seems a complex way of achieving something that can be done in a single line of code. Please use code formatting in future.CommentedMay 12, 2011 at 23:35
        -6

        import java.util.Random;

          Start asking to get answers

          Find the answer to your question by asking.

          Ask question

          Explore related questions

          See similar questions with these tags.