Koordinatengrafik mit Java
HomeAufgabenDruckenJava-Online

Simulationen

Die Zufallszahlen werden mit der Methode random() aus der Klasse Math erzeugt.

double z = Math.random() erzeugt eine Zufallszahl zwischen 0 (inklusive) und 1 (exklusive).

Mit passenden arithmetischen Operationen kann man aus diesen Zahlen ganzzahlige Zufallszahlen in einem beliebigen Wertebereich erzeugen.
Beispiele:
int z = (int)(Math.random() * 6) + 1 erzeugt eine der Zahlen 1, 2, 3, 4, 5 oder 6
int z = (int)(Math.random() * 49) + 1 erzeugt Lottozahlen

Beispiel 1: Simuliert das Werfen zweier Münzen

// KopfZahl.java 

import ch.aplu.util.*;

class KopfZahl extends Console
{
  KopfZahl()
  {
    print("Anzahl Versuche eingeben:");
    int n = readInt();
 
    int kk = 0// Anzahl Versuche mit Ausgang 2 mal Kopf
    int zz = 0// Anzahl Versuche mit Ausgang 2 mal Zahl
    int kz = 0// Anzahl Versuche mit Ausgang 1 mal Kopf und 1 mal Zahl
  
    for(int i = 0; i < n; i++)
    {
      int x = (int)(Math.random() * 2)// Zufallszahl 0 oder 1
      int y = (int)(Math.random() * 2)// Zufallszahl 0 oder 1
      
      if (== 0 && y == 0)
        kk++
        
      else if (== 1 && y == 1) 
        zz++;
      
      else
        kz++;  
    }

    println ("W'keit 2 mal Kopf 0 mal Zahl: " + (double)kk/n);
    println ("W'keit 1 mal Kopf 1 mal Zahl: " + (double)kz/n);
    println ("W'keit 0 mal Kopf 2 Mal Zahl: " + (double)zz/n);
  }

  public static void main(String[] args)
  {
    new KopfZahl();
  }
}
 

Erklärungen zum Programmcode:

int  x  = (int)(Math.random() * 2) Erzeugt zufällig 0 oder 1
(double) kk / n) kk/n ist eine Integerdivision, d.h. die Dezimalstellen werden vernachlässigt. (double)kk bewirkt, dass kk zuerst in einen Double verwandelt wird (cast-Operator). Die nachfolgende Division ist dann automatisch eine Dezimal-Division.

Beispiel 2: Unter der Verwendung von Arrays kann die Simulation auf beliebig viele Münzen erweitert werden

// KopfZahlEx2.java

import ch.aplu.util.*;

class KopfZahlEx2 extends Console
{
  KopfZahlEx2()
  {
    print("Anzahl Versuche: ");
    int n = readInt();
    
    int[] k = new int [4];
    for (int i = 0; i < 4; i++)
      k[i] = 0;
    
    for(int i = 0; i < n; i++)
    {
      int a = 0;
      for(int j = 0; j < 3; j++)
      {
        int x = (int)(Math.random() * 2)
        if (== 0)
          a = a + 1;
      }
      if (== 0) k[0]++;
      if (== 1) k[1]++;
      if (== 2) k[2]++;
      if (== 3) k[3]++;
    }
    
    for(int i = 0; i < 4; i++)
      println("Wahrscheinlichkeit " + i + "mal Kopf " + (double)k[i]/n);
  
  }

  public static void main(String[] args)
  {
     new KopfZahlEx2();
  }
}
 

 

Beispiel 3: Simuliert Zahlenlotto. Aus 49 Zahlen werden 6 zufällig gezogen und der Grösse nach sortiert ausgegeben.

// Zahlenlotto.java

import ch.aplu.util.*;

class Zahlenlotto extends Console
{
  int[] zahlen = new int[6];
  int z;

  Zahlenlotto()
  {
    println("Sechs Zalenlotto-Zahlen werden zufaellig gezogen:");
    ziehen();
    print();
    sortieren(zahlen);
    println("Sortiert:");
    print();
  }

  void ziehen()
  {
    for (int i = 0; i < 6; i++)
    {
      //prüfen, ob die neu gezogene Zahl bereits vorkommt
      boolean gleich = true;
      //so lange die neu erzeugte Zufallszahl bereits vorkommt
      while (gleich)
      {
        z = (int)(49 * Math.random() + 1);
        boolean neu = true//Flag setzen

        for (int j = 0; j < i && neu; j++)
        {
          if (== zahlen[j])
            neu = false//Flag der auf false gesetzt wird, falls gleiche Zahl bereits vorkommt
        }

        if (neu)
          gleich = false//while-Schleife wird abgebrochen, z wird ins Array geschrieben
      }
      zahlen[i] = z;
    }
  }

  void print()
  {
    for (int i = 0; i < 6; i++)
      print(" " + zahlen[i]);
    println("  ");
  }

  int [] sortieren(int [] zahlen)
  {

    for (int i = 5; i >= 0; i--)
    {
      for (int j = 0; j < i; j++)
      {
        if (zahlen[j] > zahlen[+ 1])
        {
          int temp = zahlen[+ 1]//speichert die kleinere Zahl in temp
          zahlen[+ 1] = zahlen[j]//tauscht die Zahlen so dass j+1 grösser ist
          zahlen[j] = temp;
        }
      }
    }
    return zahlen;
  }

  public static void main(String[] args)
  {
     new Zahlenlotto();
  }
}
 

Erklärungen zum Programmcode:

Dieses Beispiel umfasst zwei wichtige Programmiertechniken:
1) Eindeutige Auswahl: Bei der Wahl der Zufallszahlen darf eine Zahl nur einmal vorkommen, d.h. Beim Ziehen jeder nächsten Zahl muss überprüft werden, ob diese Zahl bereits gezogen wurde.
2) Sortieren: Die gezogenen Zahlen werden nach dem Bubblesort-Algorithmus der Grösse nach geordnet. Beim Bubblesort werden die Zahlen paarweise verglichen. Ist die Zahl links grösser als die Zahl rechts, werden die beiden Zahlen getauscht, d.h. nach jedem Schleifendurchgang steht die grösste Zahl des durchlaufenen Bereichs ganz rechts.