Java 2 Zufalls zahlen generieren.

JavaBeginner22

Aktives Mitglied
Hi ich bin grad dabei das Spiel Vier gewinnt mithilfe von Java zu programmieren. Ein Problem hindert mich weiter zu machen. Es geht um den Spielstart. Zum Beispiel, wähle ich irgend ein Bereich, wo mein Kreis Gelb oder Rot werden sollte, nun muss ich bei der ersten Wahl zufällig den Kreis mit Rot oder Gelb füllen.
Meine Idee war ich initialisiere 2 Variablen einmal int player1; int player2; dann mithilfe der Math Random Methode, eine von den variablen zufällig generieren, und wenn zbs player1 generiert wurde, soll der Kreis auf Gelb gesetzt werden, und wenn player 2 generiert wurde auf Rot. Aber ich weiß nicht wie ich es im Code umsetzen soll, ich wäre dankbar wenn es mir jemand erklären könnte
 
Java:
if (Math.random() < 0.5) {
  // player1 wurde "generiert". Setze Kreis auf gelb
} else {
  // player2 wurde "generiert". Setze Kreis auf rot
}
 
boolean ist nen java datentyp. der nur 2 werte haben kann: true/false (wahr/falsch)
Code:
boolean x = true;

if(x){
    out.println("x ist wahr");
}

[edit]

so in etwa:
Java:
Random random = new Random(System.currentTimeMillis() );
 // random  würde ich irgendwo als instanzvariable halten (wenn nicht sogar static machen)
// "System.currentTimeMillis() " sorgt dafür dass bei jedem programmstart ein anderer seed gesetzt wird
// ansonsten bekommt man immer die gleiche reihenfolge an zufallszahlen:
// https://docs.oracle.com/javase/8/docs/api/java/util/Random.html#Random-long-

if (random.nextBoolean()) {
  // player1 wurde "generiert". Setze Kreis auf gelb
} else {
  // player2 wurde "generiert". Setze Kreis auf rot
}
 
Zuletzt bearbeitet:
@lolcore Nur so als Hinweis, man muss Random nicht mit der aktuellen Zeit in Millisekunden initialisieren, es ist sogar nicht foerderlich in Java, wuerde ich sagen. In der Javadoc vom Konstruktor ohne Parameter steht drinnen dass Random mit einem Wert initialisiert wird von welchem man ausgehen kann immer eine neue Sequenz an Zahlen zu bekommen. Also folgendes gibt dir immer unterschiedliche Zahlen:

Java:
for (int counter = 0; counter < 50_000; counter++) {
    System.out.println(new Random().nextInt());
}

Wohingegen folgendes dir immer gleiche Zahlen (schaetze ich, habe ich nicht probiert, sollte aber in einer unter einer Millisekunde laufen, grob):

Java:
for (int counter = 0; counter < 50_000; counter++) {
    System.out.println(new Random(System.currentTimeMillis()).nextInt());
}

Ist aber schon richtig dass man sich darueber Gedanken machen sollte mit welchem Standard-Wert sich so ein Random initialisiert, ich weisz von .NET das lange Zeit der Standard ohne Parameter eben immer die aktuelle Uhrzeit in Sekunden war, was so richtig gar nicht foerderlich ist.
 
Ich schätze mal, dass der Seed ohne Parameter einfach der Hashcode ist.

Mal nachschauen.

EDIT: nö.
Java:
this(seedUniquifier() ^ System.nanoTime());
wobei bei seedUniquifier() als Kommentar steht:
Code:
        // L'Ecuyer, "Tables of Linear Congruential Generators of
        // Different Sizes and Good Lattice Structure", 1999
im Prinzip wird der alte Wert mit einem anderen multipliziert, bis sich der neue vom alten unterscheidet (durch die Größen wird es hier zum Überlauf kommen).
 
wenn man folgendes:
Java:
public static void main(String[] args) {
      
        Random ran = new Random(55);
      
        for(int i = 0; i < 10; i++) {
            System.out.println(ran.nextInt());

          
        }
          
    }
mehrmals ausführt liefert er immer die gleichen zufallszahlen.
bei Random ran = new Random();
nicht. da war mein fehler - dachte dass der standardkonstruktor dann den gleichen seed setzt.
 
habs mal getestet
Java:
for (int counter = 0; counter < 50_000; counter++) {
    System.out.println(new Random(System.currentTimeMillis()).nextInt());
}
liefert immer den gleichen wert. java ist so schnell dass System.currentTimeMillis() immer gleich ist.
[edit]
mit System.out.println(new Random(System.nanoTime()).nextInt()); gehts.
aber man sollte wohl einfach den standardkonstruktor verwenden.
 

Neue Themen


Zurück
Oben