2013-04-29 27 views
7

Java'da rastgele sayı üretecini, programı her çalıştırdığında aynı sayıları almaya devam ettiğinde bir arkadaşa anlatmaya çalışıyordum. Aynı şeyin kendi daha basit versiyonunu yarattım ve programımı her çalıştırdığımda da tam olarak aynı numaraları elde ediyorum.Java rastgele sayılar rasgele değil mi?

Neyi yanlış yapıyorum? 100 üzerinden

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

} 

son beş sayılardır:

40 
60 
27 
56 
53 
+1

iyi bir yol kullanımı Math.random() 'dir. – Gere

+6

Rastgele örneğinizi oluştururken sabit bir tohum kullanıyorsunuz. Tabi ki aynı sayıları alacaksın. –

+3

@Gere: Math.random() ile ilgili bu kadar büyülü şey nedir ve neden Rastgele bir örnek kullanmaktan daha iyidir? –

cevap

23

Bir sabit değer 100 ile rastgele jeneratörü ekildi var. Belirleyici, bu yüzden her koşuda aynı değerleri üretecek.

Neden 100 ile tohum seçmeyi seçtiğinizden emin değilim, ancak tohum değerinin, oluşturulan değerler aralığı ile ilgisi yoktur (bu, zaten var olan nextInt numaralı çağrı gibi başka yollarla kontrol edilir) var).

Her seferinde farklı değerler almak için, rasgele üreteci tohumlamak için sistem saatini kullanan argüman olmadan Random yapıcısını kullanın.

parametresiz Random kurucu için Javadoc alıntı:

yeni bir rastgele sayı üreteci oluşturur. Bu kurucu, rastgele sayı üretecinin tohum 'unu, bu kurucunun herhangi bir başka çağrısından farklı olması muhtemel bir değere ayarlar. parametresiz Random yapıcı gerçek kod aktaran

:

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

Bu: Sen Random Number Generator aynı tohum (100) Başlamadan her zaman veriyoruz

Random rand = new Random(100); 

program System.currentTimeMillis()'dan çıkış gibi bir şey verin ve bu her bir çağrı için farklı numaralar vermelidir.

1

Rasgele sayı üreteçleri gerçekten sadece rastlantısaldır. Yani, belirli istatistiksel kriterlere rastgele görünen sekanslar oluşturmak için deterministik araçlar kullanırlar.

Random(long seed) constuctor, sahte rasgele sayıların sırasını belirleyen bir tohumdan geçmenize izin verir. Bence bu yardımcı olur

0

Umut ..

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]; 
İlgili konular