9

I was trying to explain the random number generator in Java to a friend when he kept getting the same numbers every time he ran the program. I created my own simpler version of the same thing and I too am getting the same exact numbers he was getting every time I run the program.

What am I doing wrong?

import java.util.*;

public class TestCode{
   public static void main(String[] args){
       int sum = 0;
       Random rand = new Random(100);
       for(int x = 0; x < 100; x++){
           int num = (rand.nextInt(100)) + 1;
           sum += num;
           System.out.println("Random number:" + num);
       }
       //value never changes with repeated program executions.
       System.out.println("Sum: " + sum); 
   }

}

The final five numbers out of the 100 are:

40
60
27
56
53
Roman C
  • 49,761
  • 33
  • 66
  • 176
leigero
  • 3,233
  • 12
  • 42
  • 63

4 Answers4

23

You have seeded the random generator with a constant value 100. It's deterministic, so that will generate the same values each run.

I'm not sure why you chose to seed it with 100, but the seed value has nothing to do with the range of values that are generated (that's controlled by other means, such as the call to nextInt that you already have).

To get different values each time, use the Random constructor with no arguments, which uses the system time to seed the random generator.

Quoting from the Javadoc for the parameterless Random constructor:

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.

Quoting the actual code in the parameterless Random constructor:

public Random() {
    this(seedUniquifier() ^ System.nanoTime());
}
rgettman
  • 176,041
  • 30
  • 275
  • 357
2

This:

   Random rand = new Random(100);

You're giving the random number generator the same seed (100) each time you start the program. Give it something like the output from System.currentTimeMillis() and that should give you different numbers for each invocation.

Marvo
  • 17,845
  • 8
  • 50
  • 74
1

Random number generators are really only pseudo-random. That is, they use deterministic means to generate sequences that appear random given certain statistical criteria.

The Random(long seed) constuctor allows you to pass in a seed that determines the sequence of pseudo-random numbers.

1

Please see the below code to generate a random number from a pool of random numbers.

Random r = new Random(System.currentTimeMillis());
double[] rand = new double[500];
for(int i=0;i<100;i++){
    rand[i] = r.nextDouble();
}
double random_number = rand[randomInt];
user3503711
  • 1,623
  • 1
  • 21
  • 32