Wahrscheinlichkeiten

Ostkreuz

Aktives Mitglied
c) Schreiben Sie eine Methode public int beginneKaperfahrt(), die eine Kaperfahrt simuliert und den Gewinn in Dukaten zurückgibt.

- Auf jeder Kaperfahrt besteht eine Wahrscheinlichkeit von 80%, dass das Piratenschiff auf ein Handelsschiff trifft. Andernfalls geben Sie „Ereignislose Kaperfahrt“ auf der Konsole aus.

- Trifft das Piratenschiff auf ein Handelsschiff, ergeben sich die Händler meistens kampflos (75%) und wehren sich selten (25%). In beiden Fällen machen die Piraten Beute zwischen 100.000 und 200.000 Dukaten.

- Im Falle eines Kampfes trägt das Piratenschiff zu 30% Schäden davon, die für 50.000 Dukaten repariert werden müssen. Jedes Besatzungsmitglied wird mit einer Wahrscheinlichkeit von 5% verletzt und braucht ein Holzbein, Glasauge oder Hakenhand. Die Kosten für diese Behandlung betragen 10.000 Dukaten und werden solidarisch aus der Schiffskasse beglichen.

- Die Methode gibt am Ende den Gewinn in Dukaten zurück, d.h. die Beute abzüglich aller Kosten.

Hallo kann mir jemand sagen ob der Code soweit richtig ist, wenn ich es in einer main-Methode teste kommt irgendwie zu oft 0
Java:
    public int beginneKaperfahrt() {
        int ducats = 0;
        Random prob = new Random();
        int handelsschiff = prob.nextInt(99)+1;
        if (handelsschiff <= 80) {
        int handelsschifftreffen = prob.nextInt(99)+1;
        int newducats = prob.nextInt(99999)+100001;
        if (handelsschifftreffen <= 75) { 
            ducats = ducats + newducats;
        if (handelsschifftreffen >= 75) {
            ducats = ducats + newducats;
            int schaden = prob.nextInt(99)+1;
            int verletzung = prob.nextInt(99)+1;
            if (schaden >= 30) {
                ducats = ducats - 50000;
                if (schaden >= 95) {
                    ducats = ducats - 10000;
                }
            }
        }
        }
        }
        return ducats;
    }
 

temi

Top Contributor
zu 30% Schäden davon
mit einer Wahrscheinlichkeit von 5% verletzt
Schau dir das mal genauer an und die beiden Sachen sind unabhängig voneinander...

EDIT: Evtl. wäre es sinnvoll die Methode auf mehrere private Methoden aufzuteilen, um sie übersichtlicher zu machen. Außerdem:
Jedes Besatzungsmitglied wird mit einer Wahrscheinlichkeit von 5% verletzt
 
Zuletzt bearbeitet:

Ostkreuz

Aktives Mitglied
Das kannst du fast 1:1 übersetzen: für jeden Piraten im Array => for (..)
Java:
    public int beginneKaperfahrt() {

    int beute = 0;
    Random prob = new Random();
    int random = prob.nextInt(99)+1;
    if (random > 80) { System.out.println("Ereignislose Kaperfahrt");}
    if (random < 80) {
        int random1 = prob.nextInt(100001)+100000;
        beute = beute + random1;
        int random2 = prob.nextInt(99)+1;
        if (random2 < 75) { System.out.println ("Friedvolle Übergabe."); }
        else {
            int random3 = prob.nextInt(99)+1;
            if (random3 < 30) {
                beute = beute - 50000;
                for (int i = 0; i<ship.countPirate();i++) {
                    int random4 = prob.nextInt(99)+1;
                    if (random4 < 5) { beute = beute - 10000;}
                }
            }
        }

    }
    return beute;
So ist das jetzt richtig oder?
 

KonradN

Super-Moderator
Mitarbeiter
So ist das jetzt richtig oder?
Nein.

Wenn Du eine Prüfung hast auf entweder / oder, dann schreibe diese entsprechend. Das wäre dann ein
Java:
if (Bedingung) {
    // Was auch immer
} else {
    // Halt was anderes!
}

Da wird nicht mit zwei if gearbeiten wie deine

Java:
if (random > 80) ...
if (random < 80) ...
Denn was ist mit random == 80?

Und dann solltest Du dir die verwendete Methode Random.nextInt(int) nähe ansehen: Was erzeugst Du da? Und was muss dann die Prüfung sein bei x%?
 

temi

Top Contributor
Ich meine immer noch, dass der Schaden am Schiff und die Verletzungen der Piraten voneinander unabhängig sind. Es ist allerdings nicht eindeutig formuliert.
 

Ostkreuz

Aktives Mitglied
Nein.

Wenn Du eine Prüfung hast auf entweder / oder, dann schreibe diese entsprechend. Das wäre dann ein
Java:
if (Bedingung) {
    // Was auch immer
} else {
    // Halt was anderes!
}

Da wird nicht mit zwei if gearbeiten wie deine

Java:
if (random > 80) ...
if (random < 80) ...
Denn was ist mit random == 80?

Und dann solltest Du dir die verwendete Methode Random.nextInt(int) nähe ansehen: Was erzeugst Du da? Und was muss dann die Prüfung sein bei x%?
Aber wie soll ich hier nur ein System.out.println bei else returnen, der return erwartet ja ein int und kein void?
Könnte ich nicht auch => 80 machen?
 

temi

Top Contributor
Aber wie soll ich hier nur ein System.out.println bei else returnen, der return erwartet ja ein int und kein void?
Kein Schiff, keine Beute: return 0 (oder return beute, denn die hat ja auch einen Startwert von 0).

Das ergibt sich aber fast automatisch:
Java:
public int beginneKaperfahrt() {
    int beute = 0;
    Random prob = new Random();
    int random = prob.nextInt(99)+1;
    if (random > 80) {
        System.out.println("Ereignislose Kaperfahrt");
    }
    else {
        // ...
    }
   
    return beute;
}
 

Ostkreuz

Aktives Mitglied
Kein Schiff, keine Beute: return 0 (oder return beute, denn die hat ja auch einen Startwert von 0).

Das ergibt sich aber fast automatisch:
Java:
public int beginneKaperfahrt() {
    int beute = 0;
    Random prob = new Random();
    int random = prob.nextInt(99)+1;
    if (random > 80) {
        System.out.println("Ereignislose Kaperfahrt");
    }
    else {
        // ...
    }
 
    return beute;
}
Java:
    public int beginneKaperfahrt() {

    int beute = 0;
    Random prob = new Random();
    int random = prob.nextInt(99)+1;
    if (random < 80) {
        int random1 = prob.nextInt(100001)+100000;
        beute = beute + random1;
        int random2 = prob.nextInt(99)+1;
        if (random2 < 75) { System.out.println ("Friedvolle Übergabe."); }
        else {
            int random3 = prob.nextInt(99)+1;
            if (random3 < 30) {
                beute = beute - 50000;
                for (int i = 0; i<ship.countPirate();i++) {
                    int random4 = prob.nextInt(99)+1;
                    if (random4 < 5) { beute = beute - 10000;}
                }
            }
        }
        return beute;  
    }   else {
        System.out.print ("Ereignislose Kaperfahrt ");
        return 0;
    }
So?
 

KonradN

Super-Moderator
Mitarbeiter
Und dann solltest Du dir die verwendete Methode Random.nextInt(int) nähe ansehen: Was erzeugst Du da? Und was muss dann die Prüfung sein bei x%?
Hast Du Dir dazu mal Gedanken gemacht? Oder sind das auch Dinge, die die Übungsleiterin falsch vorgegeben hat?

a) Du willst offensichtlich Zahlen von 1..100 erzeugen. Das geht nicht mit nextInt(99)+1
b) 80% Wahrscheinlichkeit wäre - so Du Zahlen von 1...100 erzeugt hättest, ein <= 80. 1..80 wären 80% Eintrittschance und 81..100 wären die übrigen 20% Eintrittswahrscheinlichkeit. (Das <80 wäre ok, wenn Du Zahlen von 0...99 erzeugt hättest. Dann wäre es einmal 0..79 und dann 80..99)
 

Ostkreuz

Aktives Mitglied
Hast Du Dir dazu mal Gedanken gemacht? Oder sind das auch Dinge, die die Übungsleiterin falsch vorgegeben hat?

a) Du willst offensichtlich Zahlen von 1..100 erzeugen. Das geht nicht mit nextInt(99)+1
b) 80% Wahrscheinlichkeit wäre - so Du Zahlen von 1...100 erzeugt hättest, ein <= 80. 1..80 wären 80% Eintrittschance und 81..100 wären die übrigen 20% Eintrittswahrscheinlichkeit. (Das <80 wäre ok, wenn Du Zahlen von 0...99 erzeugt hättest. Dann wäre es einmal 0..79 und dann 80..99)
ja macht sinn habe jetzt über all 1-99 also nextInt(100)
 

Ostkreuz

Aktives Mitglied
Also die Variante nextInt(100) - ohne ein +1 und dann hast Du die < gelassen, also z.B. < 80? Das wäre dann ok.
Java:
    public int beginneKaperfahrt() {
    int beute = 0;
    Random prob = new Random();
    int random = prob.nextInt(100);
    if (random > 80) {
        System.out.print ("Ereignislose Kaperfahrt \n");
        return beute;
    }
    else {
        int random1 = prob.nextInt(100001)+100000;
        beute = beute + random1;
        int random2 = prob.nextInt(100);
        if (random2 < 75) { System.out.println ("Friedvolle Übergabe."); }
        else {
            int random3 = prob.nextInt(100);
            if (random3 < 30) {
                beute = beute - 50000;
                for (int i = 0; i<ship.countPirate();i++) {
                    int random4 = prob.nextInt(100);
                    if (random4 < 5) { beute = beute - 10000;}
                }
            }
        }
        return beute;
Ja genau so hatte ich es jetzt
 

mihe7

Top Contributor
Ja genau so hatte ich es jetzt
So ist das nicht ganz korrekt.

Nochmal im Detail: Du erzeugst ganzzahlige Zufallszahlen zwischen 0 (inkl.) und 100 (exkl.). Das sind 100 verschiedene Zahlen, nämlich von 0 bis inkl. 99. Jede Zahl wird mit der gleichen Wahrscheinlichkeit erzeugt (1 %).

In x % der Fälle gilt random < x. Das heißt random < 100 gilt immer, random < 99 dagegen nicht, denn random kann ja durchaus auch den Wert 99 annehmen.

Es besteht nun die Wahrscheinlichkeit von 80 %, auf ein Handelsschiff zu treffen:
Java:
if (random < 80) {
    System.out.println("Handelsschiff");
} else {
    System.out.println("Kein Handelsschiff");
}

Das wäre ok. Nimmt random einen Wert von 80 bis inkl. 99 an, wird "Kein Handelsschiff" ausgegeben. Das sind 20 verschiedene Werte von insgesamt 100, also 20 %. Nimmt random einen Wert von 0 bis inkl. 79 an, wird "Handelsschiff" ausgegeben. Das sind 80 verschiedene Werte von insgesamt 100, also 80 %. Passt.

Wenn Du die Zweige vertauschst, musst Du díe Bedingung negieren. Aus random < 80 wird aber nicht random > 80, denn dann würde der Wert 80 plötzlich dazu führen, dass "Handelsschiff" ausgegeben wird, wie in diesem Beispiel:

Java:
if (random > 80) {
    System.out.println("Kein Handelsschiff");
} else {
    System.out.println("Handelsschiff");
}

Jetzt wird nur noch bei Werten von 81 bis inkl. 99 "Kein Handelsschiff" ausgegeben, das sind 19 verschiedene Werte von 100 (also 19 % Wahrscheichnlichkeit), die 80 fehlt. Die musst Du noch hinzunehmen, korrekt wäre also

Java:
if (random >= 80) {
    System.out.println("Kein Handelsschiff");
} else {
    System.out.println("Handelsschiff");
}
 

temi

Top Contributor
Das "return beute" ist redundant. Es ist nicht falsch, aber überflüssig, denn bei einer ereignislosen Kaperfahrt, wird der gesamte else-Zweig nicht ausgeführt. Die Beute bleibt auf den Wert 0 und kann am Ende ausgegeben werden.
Java:
public int beginneKaperfahrt() {
    
    int beute = 0;
    Random prob = new Random();
    int random = prob.nextInt(100);
    
    if (random > 80) {
        System.out.print ("Ereignislose Kaperfahrt \n");
        return beute; // hier nicht notwendig
    } else {
        // hier wird die Beute berechnet
        // das wird nicht ausgeführt, wenn die Kaperfahrt ereignislos ist
    }
    
    return beute;
}
 

Neue Themen


Oben