Dienstag, 23. August 2011

Math.random() - Anwendungsbeispiele mit Erklärung

In der Programmierung werden häufig Zufallszahlen benötigt.

Eine einfache Möglichkeit, diese in Java zu erzeugen, bietet die Klasse "Math". Um eine Zufallszahl größer gleich 0.0 und kleiner als 1.0 zu erhalten, verwenden wir den in der folgenden Testklasse enthaltenen Funktionsaufruf Math.random():


public class TestRandom {
  public static void main(String[] args) { 
   double zufallszahl;
   zufallszahl = Math.random();
   System.out.println(zufallszahl);
 }
}

Doch wie erhält man nun ganzzahlige Zufallszahlen in einem festgelegten Bereich?
(z.B. eine ganze Zahl zwischen 0 und 9)

Ganz einfach!

Wir multiplizieren den von Math.random() gelieferten Wert mit der Anzahl möglicher Zufallszahlen. Das Ergebnis runden wir ab:

public class TestRandom2 {
  public static void main(String[] args) {
    int zufallszahl;
    zufallszahl = (int)(Math.random() * 10); 
    System.out.println(zufallszahl);   
  }
} 

Die Klasse TestRandom2 liefert uns also zufällige Zahlen zwischen 0 und 9. Wie erhalten wir nun beispielsweise Zahlen zwischen 1 und 10 oder zwischen 13 und 29?

Hierfür verfahren wir zunächst genauso, nur addieren wir am Ende noch die kleinstmögliche Zufallszahl zum Ergebnis hinzu, womit wir eine Verschiebung des Ergebnisbereichs bewirken.

public class TestRandom3 {
  public static void main(String[] args) {
    int zufallszahl; 
    zufallszahl = (int)(Math.random() * 10) + 1; 
    System.out.println(zufallszahl);
 }
} 

Wir erhalten nun Zahlen zwischen 1 und 10.

Für das oben genannte Beispiel einer Zufallszahl zwischen 13 und 29 muss die Zuweisung leicht verändert werden:

//Liefert eine von 17 Zufallszahlen (im Bereich von 13 bis 29)
zufallszahl = (int)(Math.random() * 17) + 13;

14 Kommentare:

  1. Dieser Kommentar wurde vom Autor entfernt.

    AntwortenLöschen
  2. Kann man das ganze auch mit Befehlen machen die dann zuföllig ausgeführt werden ?

    AntwortenLöschen
    Antworten
    1. Dafür wäre das Switch-Statement eine einfach Lösung. Jeder Zufallszahl eines bestimmten Bereiches könnte man so eine Funktion zuordnen. Siehe auch: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

      Löschen
  3. woher kommt beim Beispiel für die Zahlen zwischen 13 und 29 der Faktor 17?

    AntwortenLöschen
    Antworten
    1. Die Anzahl der Zufallszahlen bestimmt den Faktor. Es gibt bei diesem Beispiel 17 mögliche Zufallszahlen: 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29

      Löschen
  4. Zitat: "Wir erhalten eine Zahl von 1 bis 10"

    Ja, ich erhalte immer 1.0...

    AntwortenLöschen
    Antworten
    1. Der Ausdruck "(int)(Math.random() * 10) + 1" liefert Zahlen zwischen 1 und 10 mit jeweils gleicher Wahrscheinlichkeit. Hast Du den Faktor "10" auch verwendet/berücksichtigt und die Klammern beachtet?

      Löschen
  5. Wie könnte so ein Code in android aussehen?

    AntwortenLöschen
  6. Also "Android" ist keine Programmiersprache,sondern ein Betriebssystem. Apps dafür werden aber (u.a.) mit Jave programmiert. D.h. obiger Vorschlag funktioniert auch für Android-Apps. Es gibt aber eine bessere Variante, nämlich die Methode "nextInt()" der Klasse "Random". Wie man die verwendet, steht hier: https://docs.oracle.com/javase/7/docs/api/ Du findest die Klasse im Package "java.util".
    Warum ist "nextInt()" besser? Es ist effizienter, neigt bei einer großen Anzahl von Verwendungen nicht dazu größere Ergebnisse zu liefern und ist thread-save.

    AntwortenLöschen
  7. Warum ist Java so kompliziert??????????

    AntwortenLöschen
  8. Wie kann ich die Zufallszahl jetzt in einem jNumberField ausgeben?? Bei mir kommt immer nur eine komische Meldung

    AntwortenLöschen
  9. Danke. Das Tutorial hat mir sehr geholfen.

    AntwortenLöschen