# Simulation - Anfänger braucht Hilfe



## WhiteFang (27. Nov 2010)

Hallo Leute,
es ist mal wieder so weit, dass ich eure Hilfe brauche. Ich hab von meinem Mathelehrer, der immer noch fest daran glaubt, dass ich Simulationsprogramme schreiben kann, die Aufgabe (freiwillig) bekommen, mich mal wieder an einen Simulationsprogramm zu versuchen. Und wer will dann schon sagen müssen, dass er das nicht hin bekommt. Man sollte halt wissen, das mein Java-Programmier-Erfahrung leider auch schon ein Weilchen zurück liegt, also habt bitte etwas Verständnis dafür, dass ich vllt nicht so schnell mitkomme und eher mal was erklärt bekommen muss.

Nun zur Aufgabe, die aus dem Mathematik-Buch stammt und zu der ich ein Simulationsprogramm schreiben soll:

"Bei einem Skatspiel erhält jeder der drei Spieler 10 Karten, während die restlichen beiden Karten in den Skat gelegt werden. 

Felix hat genau 2 Buben und 8 weitere Karten auf der Hand und hofft, dass genau ein weiterer Bube im Skat liegt. Welche Wahrscheinlichkeit besteht hierfür?
"

Mein Problem ist es nun, dass mir jegliche Idee fehlt, wie ich überhaupt ansetzen kann, oder was ich machen soll, geschweige denn, wie ich das realisieren soll. Kann mir bitte Jemand erklären, wie ich das lösen kann?

Gruß
WhiteFang

PS: Ich kann euch keinen Ansatz präsentieren, da ich von der Lösung keinen Schimmer habe.


----------



## Landei (27. Nov 2010)

OK, zuerst einmal brauchst du die Karten nur nach "Bube" oder "Nicht-Bube" zu unterscheiden, also würde schon ein boolean zur Repräsentation reichen (Bube = true, Nicht-Bube = false). Die Verteilung der Karten für Felix ist klar: 2 Buben, 8 Nicht-Buben. Bleiben 22 Karten mit 2 Buben, die noch verteilt werden müssen.

Ich würde diese Rest-Karten in eine Liste packen. java.util.Collections hat schon eine Methode zum Mischen, nämlich shuffle. Nach dem Mischen schaust du einfach nach, ob unter den ersten beiden Karten ein oder zwei Buben sind. Das ganze Experiment wiederholst du vielleicht tausend mal und bildest die Mittelwerte (für einen oder zwei Buben) und gibst das Ergebnis aus.

Wie du siehst ist es wichtig, dir das Leben so einfach wie möglich zu machen. Also gar nicht erst mit 7,8,9,10 und so anfangen, wenn du es gar nicht brauchst. Und ob du die Karten 3-4-3 gibst, interressiert hier auch herzlich wenig.


----------



## WhiteFang (27. Nov 2010)

Na dann schon mal vielen Dank für deine schnelle Hilfe. Jetzt habe ich zumindest schon mal eine Idee davon, was ich machen muss und einen Schimmer davon, wie ich es umsetzen kann. Ich habe jetzt mal angefangen, obwohl ich zugeben muss, dass ich mit Listen und shuffle nie gearbeitet habe, da meine Java-Kenntnisse auf dem Informatikunterricht der 11 Klasse basieren. Ist der Ansatz so richtig? Ich brauche definitiv noch mehr Infos und Erklärungen dazu, wie es weiter geht... ;(


```
import java.util.Scanner;


public class skat {

	public static void main(String[] args) {
		
		int anzahlDerSimulationen;
		
		
		
// Augabe "Anzahl der Durchgänge?"
        System.out.println("Anzahl der Durchgänge?");
        
        // Eingabe der Anzahl
        Scanner get1;
        get1 = new Scanner (System.in);
        anzahlDerSimulationen = get1.nextInt();
		
        // Ausgabe der Anzahl der gewünschten Simulationen (Kontrolle)
        System.out.println("Es wird nun "+anzahlDerSimulationen+" mal simuliert.");
        
        // Erstellen der Liste
        boolean[] buben1 = new boolean[22];



   }

}
```


----------



## Michael... (27. Nov 2010)

WhiteFang hat gesagt.:


> Felix hat genau 2 Buben und 8 weitere Karten auf der Hand und hofft, dass genau ein weiterer Bube im Skat liegt. Welche Wahrscheinlichkeit besteht hierfür?


Muss es denn wirklich eine Simulation sein bzw. schaut sich der Lehrer tätsächlich den Code an?
Die Wahrscheinlichkeit lasst sich ja schnell und einfach berechnen.
Man könnte ja das Programm kurz schlafen legen ain paar Fake ausgaben machen und dann einfach das Ergebnis der Berechnung ausgeben ;-)


----------



## WhiteFang (27. Nov 2010)

Michael... hat gesagt.:


> Muss es denn wirklich eine Simulation sein bzw. schaut sich der Lehrer tätsächlich den Code an?
> Die Wahrscheinlichkeit lasst sich ja schnell und einfach berechnen.
> Man könnte ja das Programm kurz schlafen legen ain paar Fake ausgaben machen und dann einfach das Ergebnis der Berechnung ausgeben ;-)



Du bist ja mal ein Fuchs... Also ehrlich gesagt, schaut er sich das vermutlich net an, weil das nur mal wieder eine seiner "speziellen" Ideen war, die er manchmal so hat. 
Aber ich habe schon irgendwie den Ehrgeiz das wirklich hin zu bekommen, da ich ja auch wieder was daraus lernen kann. Nur alleine kann ich es halt nicht...


----------



## Gast2 (27. Nov 2010)

Naja, Landei hat dir doch schon eine Mögliche Lösung gepostet.
Die kannst du jetzt schritt für schritt umsetzen. Zunächst brauchst du mal eine eigene Klasse Karte, die hat als einziges attribut einen boolean istBube.
In deiner Simulation erzeugst du dann einmal eine Liste mit 22 Karten (20 die kein Bube sind, 2 die Buben sind). Und dann shuffelst du x-mal und schaust nach jedem shuffle ob in den ersten beiden Karten genau ein Bube ist.
Als ergebnis hast du dann i-mal genau ein Bube unter den ersten zwei karten, j-mal nicht genau ein Bube unter den ersten zwei Karten.
Die Wahrscheinlichkeit ergibst sich dann einfach aus x/i.


----------



## Landei (27. Nov 2010)

Liste füllen und mischen:

```
List<Boolean> karten = new ArrayList<Boolean>();
for(int i = 0; i < 22; i++) {
  karten.add(i < 2);
}
Collections.shuffle(karten);
```


----------



## WhiteFang (27. Nov 2010)

Super. Danke schon mal für eure Hilfe. So langsam komme ich wieder in die Materie rein...
Jetzt müsste ich nur noch wissen, wie ich die ersten beiden Plätze der Liste auslesen kann. Sry, dass ich so unfähig bin, aber damit habe ich noch nie zu tun gehabt...
Und wie kann ich ausschließen, dass beide Karten Buben sind, denn das darf ja auch net vorkommen.
So weit ist es bis jetzt voran gekommen:


```
public class skat {

	public static void main(String[] args) {
		
		int anzahlDerSimulationen;
		int anzahlBuben = 0;
		
		
		
        // Augabe "Anzahl der Durchgänge?"
        System.out.println("Anzahl der Durchgänge?");
        
        // Eingabe der Anzahl
        Scanner get1;
        get1 = new Scanner (System.in);
        anzahlDerSimulationen = get1.nextInt();
		
        // Ausgabe der Anzahl der Simulationen (Kontrolle)
        System.out.println("Es wird nun "+anzahlDerSimulationen+" mal simuliert.");
        
        // Erstellen der Liste und füllen mit Karten(shuffle)
     
        
            for (int a = 0; a < anzahlDerSimulationen; a++){
        	
        	List<Boolean> karten = new ArrayList<Boolean>();
            for(int i = 0; i < 22; i++) {
              karten.add(i < 2);
            }
            Collections.shuffle(karten);

            //Ausgabe der Kartenreihenfolge
            System.out.println("katen: "+karten+" .");
            
            //Soll die Buben zählen und in variable "anzahlBuben" summieren
            if(/*Listeneintrag1 = true*/){anzahlBuben++;}
            System.out.println("anzahl der Buben: "+anzahlBuben);
            
            if(/*Listeneintrag2 = true*/){anzahlBuben++;}
            System.out.println("anzahl der Buben: "+anzahlBuben);
            
            
        }
        
      
	}

}
```


----------



## Gast2 (27. Nov 2010)

```
karten.get(0)
```
 und 
	
	
	
	





```
karten.get(1)
```
 geben dir die ersten beiden karten


----------



## WhiteFang (27. Nov 2010)

Nur mal so zur Frage: Ich habe jetzt also die Werte (true/false) aus den ersten beiden Listeneinträgen ausgelesen und schreibe den Ersten in Boolean A und den Zweiten in Boolean B. Wieso funktioniert es nicht, wenn ich eine Bedingung schreibe, dass die Werte aus A oder B zur Bedingung gemacht werden können? Egal, ob es true oder false ist, wird einfach 1 zu anzahlBuben gezählt. Das soll aber doch nicht passieren, wenn es false ist... Wo ist hier der Wurm drinnen?


```
boolean A = karten.get(0);
            System.out.println("Skat 1: "+A);
            
            boolean B = karten.get(1);
            System.out.println("Skat 2: "+B);
            
           if(A = true)
           {
        	anzahlBuben1++;
            System.out.println("anzahl der Buben: "+anzahlBuben1+" .");
            
            
           }
           
           else 
           {
        	   anzahlNichtBuben++;
        	   System.out.println("anzahl der NichtBuben: "+anzahlNichtBuben+" .");
        	   
           }
```


----------



## eRaaaa (27. Nov 2010)

= -> Zuweisung
Was du suchst ist == ( if(A == true) ) oder noch einfacher if(A) bzw. besser if(a) und noch besser wären dann auch sprechende Namen ;>


----------



## WhiteFang (27. Nov 2010)

Also dann noch mal ein riesiges Danke! Ich habe mal wieder was für mein späteres Leben gelernt und ein wirklich nützliches Programm geschaffen. Jetzt nur noch eine Frage an alle Mathematiker unter euch:
Wie lautet denn das Korrekte Ergebnis der Aufgabe. Bei meiner Simulation kommen rund 18% raus. Kann das zutreffen?


----------



## Michael... (27. Nov 2010)

Wenn ich mich jetzt nicht koplett vertan habe, müsste die Wahrscheinlichkeit bei 2/11 also ~ 18% liegen.


----------



## Gast2 (27. Nov 2010)

Das korrekte ergebnis ist (2/22*20/21)+(20/22*2/21) ~ 0,17316


----------



## Landei (27. Nov 2010)

Genau, und zwei Buben gibt es mit (2/22)*(1/21) ~ 0,004329


----------

