Münzwurf-Simulation

Happysheep99999

Neues Mitglied
public class Münzwurf
{

public static void main(String[] args)
{
double z = Math.random();


switch (z)
{
case 1:
z > 0.5;
System.out.println("Kopf");
break;
case 2:
z < 0.5;
System.out.println("Zahl");
break;
}


}

}


Ich habe hier zwei Probleme, ich habe sie beide mal markiert:
Cannot switch on a value of type double. Only convertible int values, strings or enum variables are permitted
und
Syntax error on token ">", invalid AssignmentOperator
 

mihe7

Top Contributor
Ja, das ist kein Fall für ein switch-Statement, sondern für ein if-Statement. Wenn Du unbedingt ein switch-Statement verwenden möchtest, dann könntest Du 0.5 addieren und zu einem int casten.

Nachtrag:
Java:
if (z > 0.5) {
    System.out.println("Kopf");
} else {
    System.out.println("Zahl");
}

oder als switch:
Java:
int kopfZahl = (int) (z + 0.5);
switch (kopfZahl) {
    case 0: System.out.println("Kopf"); break;
    case 1: System.out.println("Zahl"); break;
}

Außerdem lässt sich der ternäre Operator verwenden:
Java:
    System.out.println(z > 0.5 ? "Kopf" : "Zahl");
 
Zuletzt bearbeitet:

Blender3D

Top Contributor
Ich habe hier zwei Probleme, ich habe sie beide mal markiert:
Du möchtest einen Münzwurf ( coin flip ) simulieren. Als Ergebnis erhälts du entweder Kopf oder Zahl mit einer 50% Wahrscheinlichkeit.
Jetzt möchtest du die Münze z.B. 10 x werfen.
In der main Methode könnte dann z.B. so etwas stehen.

Java:
        for( int i= 0; i <10; i++ )
            System.out.print(coinFlip()+" ");
Damit erhälts du ein leicht lesbares Programm.

Durch das Auslagern des Münzwurfes hast du die Problemstellung geteilt.
Hier die zugehörige Funktion die sich an anderer Stelle wieder verwenden lässt. Wie bereits von @mihe7 erwähnt wird hier ein if Statement benutzt. Mittels ternärem Operator lässt sich der Code auch noch etwas verkürzen.

Java:
public static String coinFlip() {      
        if( Math.random() < 0.5 )
            return "Kopf";
        return "Zahl";
    }
 
Zuletzt bearbeitet:

Oneixee5

Top Contributor
Du solltest dir selbst noch einen Gefallen tun und die Schreibweise ohne führende und endende Nullen für Literale übernehmen:
Java:
        var d1 = .5D;
        var d2 = 5D;
        var d3 = 5.D;
        var d4 = 5e9D;
        var d5 = 5e-9D;
        var d6 = 5.5D;
        // -->
        var i = 05; // Octal integer
Der Datentyp soll dabei vom Literal kommen, also D-double, F-float, L-long und Integer - implizit wenn nichts angegeben wird. So kommt es auch nicht zu Lesefehlern, bspw. für Octal-Literale.
 

mihe7

Top Contributor
Der Datentyp soll dabei vom Literal kommen, also D-double, F-float, L-long und Integer - implizit wenn nichts angegeben wird.
@Happysheep99999, um das noch ein bisschen klarer zu formulieren: ein numerisches Literal ist die Darstellung einer Zahl im Quelltext. An die Zahl kann ein Suffix angehängt werden, um den Typ des Literals explizit anzugeben (Groß- und Kleinschreibung spielt hier keine Rolle). Wird der Suffix weggelassen, wird bei Ganzzahlen implizit int angenommen, bei Dezimalzahlen double.

So ist 100_000 ein int-Literal (der Underscore darf zur Gruppierung verwendet werden), 100_000.0 ist ebenso ein double-Literal wie 100_000d, dagegen sind 100_000.0f und 100_000f float-Literale.

Damit nimmt man nicht nur dem Compiler etwas Arbeit ab, sondern beugt auch Fehlern vor. Stell Dir mal vor, Du hast eine Methode
Java:
public void machWas(long value) {
    // macht irgendwas
}

Und die rufst Du nun irgendwo im Code mit machWas(100_000) auf. Das funktioniert zunächst einwandfrei (long ist Zuweisungskompatibel zu int, so dass ein int-Wert ohne Verluste und damit automatisch zu einem long-Wert umgewandelt werden kann) - bis die Methode überladen wird:
Java:
public void machWas(long value) {
    // macht irgendwas
}
public void machWas(int value) {
    // macht irgendwas anderes
}

Da es sich bei 100_000 um ein int-Literal handelt, wird nun die Methode mit dem int-Parameter aufgerufen und nicht mehr die Methode mit dem long-Parameter. Hättest Du beim Aufruf von Anfang an machWas(100_000L) geschrieben, wäre diese Änderung unproblematisch gewesen.

Übrigens: wenn Du ein int-Literal angibst, können diese sich auch nur im Wertebereich von int bewegen. Ein System.out.println(3_000_000_000); führt damit zu einem Compiler-Fehler.
 

Ähnliche Java Themen

Neue Themen


Oben