# Java Programm Statistik Wuerfeln



## sternchen (8. Nov 2009)

Hallo alle...

Ich bin ein richtiger Programmier Anfänger und weiß einfach nicht wie ich anfangen soll bei meiner aufgabe ;(

Schreiben sie ein java programm, das eine statistik über die anzahl der zum würfeln eines paschs benötigten runden erstellt. erfragen sie die zahl der auszuführenden versuche vom nutzer. es soll ausgegeben werden, in wievielen versuchen 1,2,3,4, bis 9, 10 bis 49, bzw mind 50 runden nötig waren.

das ganze mach ich mit hilfe einer schleife das ist mir klar nur welche bedingung soll ich wählen??? müssen es evtl 2 schleifen sein? einmal eine die den pasch abfragt sprich ( würfel1==würfel2 && würfel2=würfel3) achso ja das ganze soll mit 3 Würfeln geschehen. 

LG


----------



## Final_Striker (8. Nov 2009)

dann du die anzahl der versuche kennst, kannst du auch eine for-schleife benutzen.

in der schleife muss du für jeden würfel eine zufallszahl berechnen und diese mit deiner bedingung vergleichen.


----------



## sternchen (8. Nov 2009)

also ich habe bisher das hier  aber ich komme nicht mehr weiter, ich denke mein Ansatz ist auch falsch?

class StatistikWuerfeln {

  public static void main (String [] args) {

   int wuerfel1, wuerfel2, wuerfel3, i=0;

    wuerfel1 = (int) (Math.random() * 6) +1;
    wuerfel2 = (int) (Math.random() * 6) +1;
    wuerfel3 = (int) (Math.random() * 6) +1;


   Out.println ("Bitte Anzahl gewuenschter Versuche eingeben: ");
  	int versuche= In.readInt();

	for (i=0; i==versuche; i++){ 

	wuerfel1 = (int) (Math.random() * 6) +1;
        wuerfel2 = (int) (Math.random() * 6) +1;
        wuerfel3 = (int) (Math.random() * 6) +1;

	if (wuerfel1==wuerfel2 && wuerfel1==wuerfel3);{

	 i++;
	  }

	Out.println ("Pasch in 1. Runde: "+ i +"-mal");
	Out.println ("Pasch in 2. Runde: "+ i+ "-mal");
	Out.println ("Pasch in 3. Runde: "+ i +"-mal");
	Out.println ("Pasch in 4 bis 9 Runden: "+ i +"-mal");
	Out.println ("Pasch in 10 bis 49 Runden: "+ i +"-mal");
	Out.println ("Pasch in 50 oder mehr Runden: "+ i +"-mal");

	}
  }
}


----------



## Cola_Colin (8. Nov 2009)

knapp über der Box zum Posten hat gesagt.:
			
		

> Java™ Quelltext bitte in
> 
> 
> 
> ...


----------



## ttplayer (8. Nov 2009)

Du meinst doch sicher:

```
for (i=0; i<versuche; i++)
```


----------



## sternchen (8. Nov 2009)

ok das dann ändere ich das mal.... 

also ich hatte die idee einmal eine variabale in der schleife die einmal zählt wieviele pasche man hat und eine variable muss ja die runden zählen. 

aber wie mach ich das mit der ausgabe so dass die versuche ja gleich der pasche sind. also muss die abbruchbedingung irgendwie sowas sein wie anzahl pasche= Versuche? oder ist da mein gedanke falsch?

als beispiel für die ausgabe wurde folgendes gegeben:

Bitte Anzahl gewuenschter Versuche eingeben: 100000
Pasch in 1. Runde: 2786- mal
Pasch in 2. Runde: 2663- mal
Pasch in 3. Runde: 2657- mal
Pasch in 4 bis 9 Runden: 14379- mal
Pasch in 10 bis 49 Runden: 52372- mal
Pasch in 50 oder mehr Runden: 25143- mal


----------



## ttplayer (8. Nov 2009)

Also du darfst i auf jeden Fall nicht als Schleifenzähler und als Paschzähler verwenden...
und das System.out.println() musst du noch ein bisschen ändern, sonst gibt es ja in jedem Durchlauf alles aus, oder?


----------



## SlaterB (8. Nov 2009)

die Anzahl der Versuche ist keine Abbruchbedingung, genau soviele 'Zählungen' werden durchgeführt,
eine 'Zählung' ist aber kein einzelner Wurf, sondern eine Menge von bis zu 50 Würfen, die mit einem Pasch oder bei 50 abgebrochen wird,

am besten hast du einen getrennten Aufbau, durch Methoden ideal erreichbar:

```
for ( i Anzahl Versuche) {
  int paschNach = fuehreEineZaehlungBis50Durch();
  // speichere Ergebnis dieser einen Zählung
}
```
in der Untermethode steht dann eine neue Schleife oder so


siehe auch
http://www.java-forum.org/java-basi...uerfeln-ueber-schleifen-abbruchbedingung.html


----------



## sternchen (8. Nov 2009)

oh man das verstehe ich nicht so wirklich. also ich muss die zählung der pasche doch auch mehr als 50 mal durchführen da steht ja 50 oder mehr runden? muss es dann so eine innere schleife sein die unendlich läuft und nicht terminiert ist?

i= anzahl Pasche
j= anzahl Runden

for (i=0; i< versuche; i++)


----------



## sternchen (8. Nov 2009)

näschte schleife wäre 

for( j=1; j=j ; j++)

wäre es so möglich und wie ist es mit dem int PaschNach gemeint? das hab ich noch nicht so ganz verstanden?

ich bin ein echter anfänger, sorry :bahnhof:


----------



## SlaterB (8. Nov 2009)

bei 50 kannst du abbrechen, ganz egal ob es 55 oder 39432 Versuche sind, am Ende reicht dir die Information 'mehr als 50 Versuche',
natürlich kannst du die Schleife auch zu Ende laufen lassen, so wichtig ist das nicht,

> wäre es so möglich 

von zwei Schleifendefinitionen kann man nichts sinnvoll sagen,

> wie ist es mit dem int PaschNach gemeint?

ignoriere es einfach erstmal, das macht erst Sinn, wenn du den Gesamtablauf kennst,

----

da du eigentlich nichts verstehst, wäre es eine Taktik, die Aufgabe zurückzustellen,
versuche erstmal ein Programm, welches genau 1x sooft würfelt, bis der Pasch kommt, und dann ausgibt, wieviel Versuche es waren


-------

und einer der allerbesten Tipps, die das Leben erleichtern:
NIE NIE NIE Benutzereingaben

in einem Testprogramm reicht
int versuche= 1;
statt
int versuche= In.readInt();

selbst wenn die Aufgabe Benutzereingaben verlangt, das kann man ganz am Ende einbauen, wenn alles andere funktioniert,
so hindert es einen nur


----------



## sternchen (8. Nov 2009)

so ich hab es jetzt mal mit einmal sooft versuche gemacht... 

class VersucheWuerfel {

  public static void main (String [] args) {


  int wuerfel1, wuerfel2, wuerfel3;
  int versuche=0; int i;


  wuerfel1 = (int) (Math.random() * 6) +1;
  wuerfel2 = (int) (Math.random() * 6) +1;
  wuerfel3 = (int) (Math.random() * 6) +1;

  for(i=1; !( wuerfel1==wuerfel2 && wuerfel1==wuerfel3); i++){

  versuche += i;

  wuerfel1 = (int) (Math.random() * 6) +1;
  wuerfel2 = (int) (Math.random() * 6) +1;
  wuerfel3 = (int) (Math.random() * 6) +1;

  }
  Out.println ("Versuche: " +versuche);

  }
  }


das wäre ja so richtig oder? hab es auch ausprobiert und es funtioniert =)

so jetzt hab ich das prinzip glaube verstanden... wie macht man das denn jetzt dür die 1. runde 2. runde usw:?


----------



## ttplayer (8. Nov 2009)

sternchen hat gesagt.:


> so ich hab es jetzt mal mit einmal sooft versuche gemacht...
> 
> class VersucheWuerfel {
> 
> ...




```
int w1, w2, w3, Treffer = 0, Versuche = 50; //z.B.

for (int i = 0; i < Versuche ; i++)
{
    w1 = (int) (MATH.random() * 6 + 1);
    w2 = (int) (MATH.random() * 6 + 1);
    w3 = (int) (MATH.random() * 6 + 1);
    if (w1 = w2 && w1 = w3) Treffer++;
}
System.out.printf("Bei %d Versuchen gab es %d Paschs", Versuche, Treffer);
```


----------



## SlaterB (8. Nov 2009)

ttplayer, dein Programm macht was anderes, das verwirrt hier etwas, wobei auch nicht uninteressant,

die Aussage 'bei 100 Versuchen gab es 10 Paschs' bringt wenig, man möchte eher pro Pasch wissen, wieviele Versuche dafür nötig waren,
das kann man aus so einer großen Schleife bei geschickter Mitzählung auch herauslesen,
das Konzept mit zwei Schleifen scheint mir aber eingängiger

--------
@sternchen
soweit ganz gut, 
am Ende hast du ja eine Ausgabe '1 Versuche' oder '50 Versuche' oder so, bzw. auch über 50, das solltest du auf 50 kürzen, oder auch erstmal egal,

diesen ganzen Code packst du nun in eine separate Methode, statt Out.println wird die Zahl zurückgegeben,
Aufruf der Methode:
int paschNach = fuehreEineZaehlungBis50Durch();
oder meinetwegen
int versuche = fuehreEineZaehlungBis50Durch();

der Rückgabewert ist eine Zahl von 1 bis 50 bzw. auch mehr als 50


nun beginnt der Rest des Programms, nun musst du diese Aktion x-mal wiederholen, 
die Anzahl der Wiederholungen hieß in deinem früheren Programmen auch 'versuche', das ist schlecht, denn mit der Zahl 1-50 hat das nix zu tun,
es geht jetzt um die Anzahl der Wiederholungen

wie gesagt brauchst du also eine Schleife 

```
for ( i Anzahl Wiederholungen) {
  int paschNach = fuehreEineZaehlungBis50Durch();
  // speichere Ergebnis dieser einen Zählung
}
```
so bekommst du x verschiedene oder auch gleiche Ergebnisse, die du dir alle merken musst
um am Ende auszugeben, wieviel von jeder Art dabei war,
da denk mal drüber nach


----------



## sternchen (8. Nov 2009)

meinst du es so?

int wuerfel1, wuerfel2, wuerfel3;

    wuerfel1 = (int) (Math.random() * 6) +1;
    wuerfel2 = (int) (Math.random() * 6) +1;
    wuerfel3 = (int) (Math.random() * 6) +1;


   Out.println ("Bitte Anzahl gewuenschter Versuche eingeben: ");
  	int versuche= In.readInt();
	int i //Anzahl der Wiederholungen

	for (i=0; i< versuche; i++){ 


	int versuche= fuehreEineZaehlungBis50Durch();

	wuerfel1 = (int) (Math.random() * 6) +1;
        wuerfel2 = (int) (Math.random() * 6) +1;
        wuerfel3 = (int) (Math.random() * 6) +1;
	 }
}


bei der ausgabe muss ich dann Out.println( und dann irgendwas mit den versuchen?)  hin schreiben? oder geht es mit 1. Runde 2.Runde??? eingentlich sollte ich ja i. Runde immer schreiben oder? aber wie mach ich es dann bei zb. 4-9. runde?


----------



## SlaterB (8. Nov 2009)

wie wenig kann ein Mensch verstehen?
der ganze Code aus dem Posting 11:48 macht genau eins: er berechnet eine Zahl 'versuche',
der ganze Code (hier nochmal: ganze ganze ganze ganze ganze ganze) soll in eine Methode

wenn das fertig ist, kann man die Methode aufrufen:
int versuche= fuehreEineZaehlungBis50Durch();
und zwar von woanders aus,

wie schaffst du es dann, diesen Aufruf genau in die Mitte des vorhandenen, für sich eigentlich abgeschlossenen fertigen Code einzufügen?
zu solchem Unverständnis kann ich nicht helfen

------

und ich schreib extra noch, dass es zwei verschiedene 'versuche' gibt,
zum einen die eingelesene Zahl, z.B. 100000
zum anderen das Ergebnis einer Pachschreibe, die Zahl 1-50,
die beiden Dinge haben nichts miteinander zu tun

auch das schaffst du wieder komplett durcheinanderzubringen,
wenn du das wenigstens auseinanderhalten könntest, wäre für einen Tag schon viel geschafft...


----------



## SlaterB (8. Nov 2009)

hier noch zum Abschreiben  :
http://www.java-forum.org/java-basics-anfaenger-themen/90978-logikfehler-programm-finden.html


----------



## Charlie (25. Mrz 2012)

Hallo...
ich habe gerade erst mit Java begonnen, und mich würde interessieren, warum man hier noch +1 schreibt: 


```
(int) (Math.random() * 6) +1;
```

Ist vielleicht eine blöde Frage, wäre aber äußerst dankbar für eine Antwort


----------



## IMartin (25. Mrz 2012)

@Charlie:

```
Math.random()
```
 liefert einen Wert >= 0 und < 1

```
(int)(Math.random()*6)
```
 liefert also entweder 0, 1, 2, 3, 4 oder 5

```
(int)(Math.random()*6) + 1
```
 entsprechend 1, 2, 3, 4, 5 oder 6 wie bei einem Würfel.


----------



## Charlie (25. Mrz 2012)

Vielen Dank!


----------

