2016-11-09 7 views
-1

Ich habe zufällig sein gearbeitet, um die Mitarbeiterzahl Variable zu erhalten, aber dieseKann nicht von Zufallszahlen erhalten

nicht herausfinden können
public class Coin 
{ 
    private final int HEADS = 0; 
    private final int TAILS = 1; 
    private int face; 
    private static int seed =0; 
    private Random r; 
    public Coin() 
    { 
     r = new Random(seed); 
     flip(); 
     seed++; 
    } 
    public void flip() 
    { 
     face = r.nextInt(2); 
    } 
    public int getFace() 
    { 
     return face; 
    } 
    public void setFace(int newFace) 
    { 
     face = newFace; 
    } 
    public boolean isHeads() 
    { 
     return (face == HEADS); 
    } 
    public String toString() 
    { 
     String faceName; 
     if (face == HEADS) 
      faceName = "Heads"; 
     else 
      faceName = "Tails"; 
     return faceName; 
    } 
    public static void main(String[] args) 
    { 
     Coin myCoin = new Coin(); 
     double randnumber =Math.random(); 
     int headCount=0; 
     for (int i =1; i<=100; i++) 
     { 
      myCoin.flip(); 
      if(myCoin.isHeads()) 
      { 
       headCount++; 
      } 
     } 
     System.out.println("If I flip my coin 100 times, I get " + headCount + " heads."); 
     headCount =0; 
     for (int i =1; i<=100; i++) 
     { 
      Coin yourCoin = new Coin(); 
      yourCoin.flip(); 
      if(yourCoin.isHeads()) 
      { 
       headCount++; 
      } 
     } 
     System.out.println("If I flip 100 coins, I get " + headCount + " tails."); 

    } 
} 

Jedes Mal, wenn ich es Kompilieren und Ausführen des Programms ich die gleiche Leistung erhalten, die

ist Wenn ich meine Münze 100 Mal kippe, bekomme ich 47 Köpfe. Wenn ich 100 Münzen kippe, bekomme ich 50 Schwänze.

Ich verstehe nicht, wie Sie die 47 und 50 zu neuen Zufallszahlen jedes Mal machen, wenn Sie das Programm ausführen. Ich habe int Math.Random und andere zufällige Variablen angesehen, bin mir aber nicht sicher, wie ich es in dieses Programm implementieren kann.

+4

Nun ja, das ist der springende Punkt bei der Verwendung eines Samens: damit Sie jedes Mal dasselbe Ergebnis erhalten. – azurefrog

+0

Können Sie das etwas klarer sagen. Das ist die ganze Verwendung eines Seeds –

+1

Wenn Sie nicht jedes Mal die gleichen Ergebnisse wollen, setzen Sie Ihren Zufallszahlengenerator nicht jedes Mal mit der gleichen Initialeingabe. Der Sinn des Setzens eines Seeds besteht darin, ** jedes Mal, wenn Sie das Programm ausführen, ** die gleichen Ergebnisse zu garantieren. – azurefrog

Antwort

1

Was Sie wollen, ist: r = neue Random (System.currentTimeMillis());

BTW: Zufallszahlen Generatoren beginnen immer mit der gleichen Zahl, mit einem bestimmten Samen.

Zum Beispiel angenommen, der "Zufallszahl" Generator hinzugefügt 2, um die nächste Zufallszahl zu finden.

seed = 9 r (9) = 11; r (11) = 13; r (13) = 15.

Ein anderer Seed wird jedoch zu einer anderen Zeichenfolge führen.

seed = 4 r (4) = 6;

+2

"Was du willst ist" Nicht unbedingt. Es ist einfacher, 'r = new Random();' zu verwenden, da es intern einen Seed generiert, wenn Sie dies nicht tun. –

1

Zufallszahlen in der Computerprogrammierung sind nicht wirklich zufällig. Sie hängen von einem Startwert ab. Wenn Sie jedes Mal den gleichen Seed geben, erhalten Sie jedes Mal die gleiche Folge von "zufälligen" Werten.

Wenn Sie stattdessen den leeren Konstruktor für Random verwenden, erstellt er einen Seed für Sie, der auf der aktuellen Systemnanozeit basiert. Auf diese Weise schränken Sie die Wahrscheinlichkeit ein, dass Sie mit demselben Saatgut beginnen.

So, wie andere bereits erwähnt haben, rufen Sie entweder den leeren Random-Konstruktor auf oder erstellen Sie selbst einen Pseudozufalls-Seed, bevor Sie ein Random erstellen, das das Seed-Argument übernimmt.

Mit allem, was gesagt wird, ist es wahrscheinlich am besten anzunehmen, dass die JDK-Implementierer bereits darüber nachgedacht haben, wie man am besten einen Seed für Sie generiert, also sollten Sie einfach den leeren Konstruktor verwenden.

Wenn Sie die Java-Quellcode für die Klasse Random sehen möchten, können Sie für die Suche

grepcode java.util.Random.java 

und sehen, wie die JDK-Implementierer den Samen erstellen.

0

Lösen Sie das Startproblem, indem Sie Random in der Klasse direkt in einer Methode deklarieren.

private Random r = new Random(); 

public Coin() 
{ 
    int x = r.nextInt(); 
    flip(); 
}