# Wahrscheinlichkeiten



## Ostkreuz (18. Dez 2022)

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

```
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 (18. Dez 2022)

Ostkreuz hat gesagt.:


> zu 30% Schäden davon





Ostkreuz hat gesagt.:


> 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:


Ostkreuz hat gesagt.:


> *Jedes* Besatzungsmitglied wird mit einer Wahrscheinlichkeit von 5% verletzt


----------



## mihe7 (18. Dez 2022)

Ostkreuz hat gesagt.:


> Hallo kann mir jemand sagen ob der Code soweit richtig ist


Der kann nicht richtig sein, weil schon der erste Punkt der Aufgabe nicht umgesetzt ist. 

Und achte unbedingt auf korrekte Einrückungen.


----------



## Ostkreuz (19. Dez 2022)

temi hat gesagt.:


> 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:


Wie mach ich es den für jeden Piraten?


----------



## temi (19. Dez 2022)

Ostkreuz hat gesagt.:


> Wie mach ich es den für jeden Piraten?


Das kannst du fast 1:1 übersetzen: für jeden Piraten im Array => for (..)


----------



## Ostkreuz (19. Dez 2022)

temi hat gesagt.:


> Das kannst du fast 1:1 übersetzen: für jeden Piraten im Array => for (..)




```
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?


----------



## mihe7 (19. Dez 2022)

Ostkreuz hat gesagt.:


> So ist das jetzt richtig oder?


Was passiert denn, wenn random == 80 gilt?


----------



## KonradN (19. Dez 2022)

Ostkreuz hat gesagt.:


> 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 

```
if (Bedingung) {
    // Was auch immer
} else {
    // Halt was anderes!
}
```

Da wird nicht mit zwei if gearbeiten wie deine


```
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 (19. Dez 2022)

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 (19. Dez 2022)

KonradN hat gesagt.:


> Nein.
> 
> Wenn Du eine Prüfung hast auf entweder / oder, dann schreibe diese entsprechend. Das wäre dann ein
> 
> ...


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?


----------



## Ostkreuz (19. Dez 2022)

temi hat gesagt.:


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


unsere übungsleiterin hat und das als unteraufgabe zu schaden am schiff erklärt


----------



## temi (19. Dez 2022)

Ostkreuz hat gesagt.:


> 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:

```
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;
}
```


----------



## temi (19. Dez 2022)

Ostkreuz hat gesagt.:


> unsere übungsleiterin hat und das als unteraufgabe zu schaden am schiff erklärt


Dann wird das so stimmen.


----------



## Ostkreuz (19. Dez 2022)

temi hat gesagt.:


> Kein Schiff, keine Beute: return 0 (oder return beute, denn die hat ja auch einen Startwert von 0).
> 
> Das ergibt sich aber fast automatisch:
> 
> ...




```
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 (19. Dez 2022)

KonradN hat gesagt.:


> 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 (19. Dez 2022)

KonradN hat gesagt.:


> 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)


----------



## temi (19. Dez 2022)

Ostkreuz hat gesagt.:


> ja macht sinn habe jetzt über all 1-99 also nextInt(100)


Das liefert dir Zufallszahlen im Bereich von 0-99, siehe https://docs.oracle.com/javase/8/docs/api/java/util/Random.html#nextInt-int-


----------



## KonradN (19. Dez 2022)

Also die Variante nextInt(100) - ohne ein +1 und dann hast Du die < gelassen, also z.B. < 80? Das wäre dann ok.


----------



## Ostkreuz (19. Dez 2022)

KonradN hat gesagt.:


> Also die Variante nextInt(100) - ohne ein +1 und dann hast Du die < gelassen, also z.B. < 80? Das wäre dann ok.




```
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 (19. Dez 2022)

Ostkreuz hat gesagt.:


> 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:

```
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:


```
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


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


----------



## temi (20. Dez 2022)

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.

```
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;
}
```


----------

