# Java Wahrscheinlichkeiten



## BabyBlue (8. April 2009)

Hey Leute, 

brauche dringend Hilfe! 

_public class Uebung01  {
   public static void main (String [] args) {

      CommandLine cl=new CommandLine();
      int x = cl.readInt( "Geben Sie die Anzahl der Würfe an:");

      for (int j = 0;j<x ;j++ ) {
      int i = (int) ((Math.random()*6) + 1);
      System.out.println(i);
      }

      System.out.println("\n");
      }
}_

Wie ihr sehen könnt erzeugt das Programm x beliebige Zufallszahlen im Intervall von 1-6.

Ich muss das Programm so erweitern, dass die Anzahl der Würfe für jede Zahl gezählt und am Ende als Prozentzahl angezeigt werden.

Ich weiß dass ich jetzt mit arrays arbeiten muss aber ich weiß nicht WIE ich anfangen soll kann mir jemand von euch einen Ansatz oder so geben?

MfG


----------



## Matze (8. April 2009)

Hi,

du könntest auch erstmal 6 versiedene Variablen nehmen und diese jeweils um eins hochzählen, wenn entsprechende Zahl kommt und später das ganze per Array realisieren.
Ansonsten:

```
int arZahlen[] = new int[6];
```
erstellt dir ein Array mit Länge 6. Wenn du auf ein bestimmtes Feld zugreifen willst, musst du den entsprechenden Index angeben. Beachte aber, dass ein Array bei 0 begint. Dieses 6Stellige Array geht also von Feld 0 - 5.

Ich denke mal du kommst selbst hinter die Logik, oder? 

Noch Fragen?


----------



## BabyBlue (8. April 2009)

Danke für die schnelle Antwort!
hmmm ja ich glaub ich weiß was du meinst! 

Ich soll für jeden Zahl (1-6) einen Array erstellen. 
Wie geht es dann mit dem zählen der Häufigkeit der Zahlen?

Gruß


----------



## Matze (8. April 2009)

Nö, hast mich wohl nicht richtig verstanden ^^

Du hast ein Array mit 6 Feldern. Jedes Feld steht für eine Zahl.
Sagen wir mal das erste Feld steht für die Zahl 1. Dann speicherst du im Feld für die Zahl 1 eben wie oft diese schon dran gekommen ist. 
Du nimmst deine Zufallszahl um damit auf das Array zuzugreifen:

```
arZahlen[iZufallszahl];
```
Jetzt haben wir aber das Problem, dass ein Array mit 0 zu Zählen beginnt, sodass du spätestens bei der Zahl 6 eine ArrayOutOfBound-Exception bekommst, da das Array ja nur bis zum Index 5 geht.. Da gibt es aber einen Trick:

```
arZahlen[iZufallszahl-1];
```
Ich hoffe mal du verstehst wie ich das meine. Das Feld mit dem Index 0 steht für die Zahl 1, der Index 1 für 2, usw...


```
for (int j = 0;j<x ;j++ ) {
    int i = (int) ((Math.random()*6) + 1);
    arZahlen[i-1]++;
    System.out.println(i);
}
```
Kannst du mir folgen?

Am Ende hättest du dann ein Array in dem der Reihe nach angeordnet steht, wie oft jede Zahl dran kam


----------



## jeipack (8. April 2009)

Hi
Du kannst in deiner for-Schleife wie Matze schon erwänt hat den betreffenden Wert im Array um 1 erhöhen (arZahlen[i-1]=arZahlen[i-1]+1; oder Kurzschreibweise: arZahlen[i-1]++

Und am Schluss die jeweiligen Arrayeinträge durch x (deine Anzahl Würfe) teilen und ausgeben.


Gruss


----------



## Matze (8. April 2009)

Falls dir meine Erklährung noch etwas zu schwammig ist (war ein langer Tag) dann kannst du dir auch noch das Tutorial aus unserm Forum ansehen


----------



## BabyBlue (8. April 2009)

Hey, also ich habe schon mal soweit gemacht:


```
public class Uebung01  {

   public static void main (String [] args) {

      CommandLine cl=new CommandLine();
      int x = cl.readInt( "Geben Sie die Anzahl der Würfe an:");

      int arZahlen[] = new int[6];
      arZahlen[0] = 1;
      arZahlen[1] = 2;
      arZahlen[2] = 3;
      arZahlen[3] = 4;
      arZahlen[4] = 5;
      arZahlen[5] = 6;

      for (int j = 0;j<x ;j++ ) {
      int i = (int) ((Math.random()*6) + 1);
      arZahlen[i-1]++;
      System.out.println(i);
      }

      System.out.println("\n");
   }

}
```

Ist doch alles richtig soweit oder?


----------



## Clash (8. April 2009)

wozu initialisierst du das feld "arZahlen" mit 1-6? du möchtest doch die Anzahl der Würfe zählen, also musst du jeden Eintrag mit 0 initialisieren sonst würde das bedeuten das am Anfang (wo noch kein Wurf getätigt wurde) die 6 schon 6 mal vorgekommen ist und das is ja wohl nicht so gedacht


----------



## BabyBlue (8. April 2009)

achso ok! 

Wenn ich aber den Array anzeigen will kommt da immer 0 
ich muss doch dass noch irgendwie zuwseisen oder?


----------



## Masterclavat (8. April 2009)

Die Zuweisung findet dort statt:


```
arZahlen[i-1]++;
```

Das Feld der Zufallszahl wird um 1 erhöht.

Alternativ kann man es auch so schreiben:


```
arZahlen[i-1] = arZahlen[i-1] + 1;
```

Aber das wurde ja schon weiter oben erwähnt.


----------



## BabyBlue (8. April 2009)

super ich glaub ich hab's langsam! 

Danke!


----------



## BabyBlue (9. April 2009)

```
import java.text.*;

public class Uebung01c2  {

   public static void main (String [] args) {

      CommandLine cl=new CommandLine();
      int x = cl.readInt( "Geben Sie die Anzahl der Würfe an:");

      int arZahlen[] = new int[6];
      arZahlen[0] = 0;
      arZahlen[1] = 0;
      arZahlen[2] = 0;
      arZahlen[3] = 0;
      arZahlen[4] = 0;
      arZahlen[5] = 0;

      int asZahlen[] = new int[6];
      asZahlen[0] = 0;
      asZahlen[1] = 0;
      asZahlen[2] = 0;
      asZahlen[3] = 0;
      asZahlen[4] = 0;
      asZahlen[5] = 0;

      for (int j = 0;j<x ;j++ ) {
      int i = (int) ((Math.random()*6) + 1);
      arZahlen[i-1]++;
      System.out.print(i+" ");
      }
      
      System.out.println("\n");
      
      for (int y = 0;y<x ;y++ ) {
      int z= (int) ((Math.random()*6) + 1);
      asZahlen[z-1]++;
      System.out.print(z+" ");
      }
      System.out.println("\n");

      double a = x * 2;

      double eins = asZahlen[0]+arZahlen[0] * 100.0 / a;
      double zwei = asZahlen[1]+arZahlen[1] * 100.0 / a;
      double drei = asZahlen[2]+arZahlen[2] * 100.0 / a;
      double vier = asZahlen[3]+arZahlen[3] * 100.0 / a;
      double fuenf = asZahlen[4]+arZahlen[4] * 100.0 / a;
      double sechs = asZahlen[5]+arZahlen[5] * 100.0 / a;

      DecimalFormat f = new DecimalFormat("#0.00");

      System.out.println("Die Zahl 1 wurde zu " + (f.format(eins))+ "% gewürfelt." );
      System.out.println("Die Zahl 2 wurde zu " + (f.format(zwei))+ "% gewürfelt." );
      System.out.println("Die Zahl 3 wurde zu " + (f.format(drei))+ "% gewürfelt." );
      System.out.println("Die Zahl 4 wurde zu " + (f.format(vier))+ "% gewürfelt." );
      System.out.println("Die Zahl 5 wurde zu " + (f.format(fuenf))+ "% gewürfelt." );
      System.out.println("Die Zahl 6 wurde zu " + (f.format(sechs))+ "% gewürfelt." );

      System.out.println("\n");
      


   }

}
```

Hey Leute, hab das Programm mal ausgebaut so dass jeweils 2 Zahlen gewürfelt werden sollen....

Mein Problem: 



also die Zahlen aus der 1. Reihe (3 und 6) sind aus dem Array "arZahlen[]"
und die Zahlen aus der 2. Reihe (1 und 1) sind aus dem Array "asZahlen[]"

Meine Frage: Wieso steht da 2% anstatt 50% ?

Danke im vorraus...


----------



## Matze (9. April 2009)

Also erstmal solltest du dir angewöhnen sprechende Variablennamen zu wählen, kann man ja kaum lesen und wärde der Code größer hätte ich dann gar keine Lust mehr gehabt ihn anzuschauen. Dann solltest du das zweite Array nich asZahlen nennen. Ich habe beim ersten bewusst die Vorsilbe "ar" gewählt, damit man weiß, dass es sich um ein Array handelt.

Kommt das nur bei der eins vor? Lass dir zusätlich mal alles Zahlen, die zum berechnen des ersten %-Wertes ausgeben.


----------



## Tommytiger (9. April 2009)

```
import java.io.Console;

public class Main {

    public static void main(String[] args) {
        int[] wuerfelzahl = new int[6];
         Console c = System.console();
         System.out.println("Wieviele Wuerfe?");
         int anz = Integer.parseInt(c.readLine());
         for (int i=0;i<anz;++i){
             int wurf = (int) ((Math.random()*6) + 1);
             ++wuerfelzahl[wurf-1];
         }
         for(int i=0; i<6; ++i){
             System.out.format("Die Zahl %d wurde zu %f Prozent gewuerfelt.\n",
                     i, 100.0*wuerfelzahl[i]/anz);
         }
    }

}
```

Nicht schön, funktioniert aber.


----------

