Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java random numbers not random?

Tags:

java

random

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
like image 789
leigero Avatar asked Apr 29 '13 23:04

leigero


2 Answers

Hope this helps..

Random r = new Random(System.currentTimeMillis());
double[] rand = new double[500];
for(int i=0;i<100;i++){
    rand[i] = r.nextDouble();
    //System.out.print(rand[i] + "\n");
}
//System.out.println();
return rand[randomInt];
like image 73
user3503711 Avatar answered Oct 06 '22 11:10

user3503711


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());
}
like image 31
rgettman Avatar answered Oct 06 '22 12:10

rgettman