2013-04-29 15 views
7

Próbowałem wyjaśnić znajomemu generator liczb losowych w Javie znajomemu, gdy ciągle pobierał te same numery za każdym razem, gdy uruchamiał program. Stworzyłem własną prostszą wersję tego samego i ja też otrzymuję dokładnie te same liczby, które dostawał za każdym razem, gdy uruchomiłem program.Losowe liczby Java nie są losowe?

Co robię źle?

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); 
    } 

} 

Końcowe pięć liczb z 100 to:

40 
60 
27 
56 
53 
+1

moim zdaniem jest lepsze wykorzystanie sposób Math.random(). – Gere

+6

Podczas tworzenia Przypadku losowego używasz stałego materiału siewnego. Więc dostaniesz te same liczby. –

+3

@Gere: co jest tak magicznego w 'Math.random()' i dlaczego jest lepsze niż przypadek losowy? –

Odpowiedz

23

Masz zaszczepiono losowy generator o stałej wartości 100. Jest deterministyczny, więc generuje te same wartości, które są uruchamiane.

Nie jestem pewien, dlaczego zdecydowałeś się obsadzić go wartością 100, ale wartość początkowa nie ma nic wspólnego z zakresem generowanych wartości (jest to kontrolowane przez inne środki, takie jak połączenie z numerem nextInt, mieć).

Aby za każdym razem uzyskać różne wartości, należy użyć konstruktora Random bez żadnych argumentów, który wykorzystuje czas systemowy do rozpoczęcia losowego generatora.

Cytując Javadoc dla konstruktora bez parametrów Random:

Tworzy nowy generator liczb losowych. Ten konstruktor ustawia ziarno generatora liczb losowych na wartość bardzo prawdopodobną, że różni się od jakiegokolwiek innego wywołania tego konstruktora.

Cytowanie rzeczywisty kod do konstruktora bez parametrów Random:

public Random() { 
    this(seedUniquifier()^System.nanoTime()); 
} 
2

to:

Random rand = new Random(100); 

Dajesz generator liczb losowych tego samego materiału siewnego (100) przy każdym uruchomieniu program. Podaj coś podobnego do wyjścia z System.currentTimeMillis(), które powinno dawać różne liczby dla każdego wywołania.

1

Generatory liczb losowych są w rzeczywistości tylko pseudolosowe. Oznacza to, że używają deterministycznych środków do generowania sekwencji, które pojawiają się losowo, biorąc pod uwagę określone kryteria statystyczne.

Cewka Random(long seed) umożliwia przekazanie materiału siewnego, który określa kolejność liczb pseudolosowych.

0

Nadzieja to pomaga ..

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];