# Mittelwert berechnen



## virtual12 (30. Dez 2015)

Ich habe ein Programm geschrieben, das eine vom Benutzer vorgegebene Anzahl an Zufallszahlen ausgibt. Das funktioniert auch. Jetzt möchte ich aber noch den Mittelwert der ausgegebenen Zufallszahlen berechnen. Dass man dafür alle ausgegebenen Werte addieren muss und dann durch die Anzahl der Werte teilen muss, ist mir klar. Wie schaffe ich das in meinem Programm umzusetzen? Versucht habe ich das mit double Average und nachfolgender Ausgabeanweisung. Hier kommt aber das falsche Ergebnis. Warum? Was mache ich falsch? Hat jemand einen Vorschlag, wie ich es richtig mache, damit am Ende der Mittelwert rauskommt?
Hier mein bisheriger Versuch:

```
public class AverageZufall {
  public static void main(String[]args) {
   int N = Integer.parseInt(args[0]);
   int i = 1;
   double Zufall = Math.random();
    while(i<=N) {
  System.out.println(Zufall);
   Zufall = Math.random();
   i = i+1;
  }
   double Average = (i)/(N);
  System.out.println(Average);
}
}
```


----------



## KaffeeFan (30. Dez 2015)

http://www.java-forum.org/thema/durchschnitt-berechnen.140626/


----------



## virtual12 (30. Dez 2015)

Danke für deine Antwort, aber leider hilft mir der Link noch nicht weiter. Kann mir vielleicht jemand konkret an meinem Beispiel erklären, was und warum ich das falsch gemacht habe und wie es richtig geht? Danke im voraus.


----------



## KaffeeFan (30. Dez 2015)

Was soll int N deiner Meinung nach denn für einen Wert haben?


----------



## MWin123 (30. Dez 2015)

Du rechnest `double Average = (i)/(N);` und nicht die Summe der Zufallswerte durch n.


----------



## virtual12 (30. Dez 2015)

Zum Beispiel den Wert 5 und dann müssen die 5 Zufallswerte ja addiert werden und für die Berechnung des Mittelwertes wieder durch 5 geteilt werden.


----------



## Bitfehler (30. Dez 2015)

Dann addiere doch mal die Zufallswerte 



Spoiler: Ist ja fast Jahresende





```
public class AverageZufall {
  public static void main(String[]args) {
  
   int n = Integer.parseInt(args[0]);
   int i = 1;
   double zufall = 0.0;
   while(i<=n) {
      zufall = zufall + Math.random();
      i++;
  }
   double average = zufall/i;
   System.out.println(average);
}
}
```


----------



## virtual12 (30. Dez 2015)

Ja, aber wie muss ich das in Java aufschreiben. Vielleicht mit N++?


----------



## MWin123 (30. Dez 2015)

Weißt du überhaupt was "n++" macht? 
Das ist eine Abkürzung für "n = n + 1".

Da du nicht 1, sondern die Zufallszahlen addieren willst, ist das falsch.

`int sum = 0`
`sum = sum + 10` oder kurz `sum += 10`

Statt 10 musst du natürlich deine Zufallszahl nehmen.


----------



## virtual12 (30. Dez 2015)

Okay, danke! Die Summe habe ich jetzt. Jetzt muss ich dann nur noch durch die Anzahl der Zufallszahlen, also N teilen?


----------



## virtual12 (30. Dez 2015)

Also durch N teilen führt nicht zum richtigen Ergebnis. Aber ich muss doch durch die Anzahl der Zufallszahlen teilen und das ist doch die vom Benutzer vorgegebene Zahl, die ich mit N bezeichnet habe? Was ist hier falsch? Verstehe das nicht nicht so ganz.


----------



## MWin123 (30. Dez 2015)

virtual12 hat gesagt.:


> Was ist hier falsch?


Ohne dem Code wissen wir das auch nicht.


----------



## virtual12 (30. Dez 2015)

Sorry, habe den Code vergessen einzufügen

```
public class AverageZufall {
  public static void main(String[]args) {
   int N = Integer.parseInt(args[0]);
   int i = 1;
   double Zufall = Math.random();
    while(i<=N) {
  System.out.println(Zufall);
   Zufall = Math.random();
   i = i+1;
  }
   double sum = 0;
   sum = sum + Zufall;
   double Average = sum/N;
  System.out.println("Average is: " + Average);
}
}
```


----------



## Bitfehler (30. Dez 2015)

Du summierst falsch. In meinem ersten Beitrag steht ein Beispiel, auf deinem Code basierend


----------



## virtual12 (30. Dez 2015)

Tut mir leid, aber jetzt stehe ich völlig auf dem Schlauch. Warum summiere ich falsch? Ich dachte ich muss die Zufallswerte summieren?


----------



## MWin123 (30. Dez 2015)

Rück mal deinen Code richtig ein und dann siehst du selber wo das Problem liegt.


----------



## virtual12 (30. Dez 2015)

```
public class AverageZufall {
  public static void main(String[]args) {
     int N = Integer.parseInt(args[0]);
        int i = 1;
        double Zufall = Math.random();
           while(i<=N) {
     System.out.println(Zufall);
      Zufall = Math.random();
          i = i+1;
  }
      double sum = 0;
      sum = sum + Zufall;
      double Average = sum/N;
    System.out.println("Average is: " + Average);
  }
}
```

Da ich noch Anfänger bin, kann ich mit deinem Hinweis den Code einzurücken und den Fehler dadurch zu sehen leider nichts anfangen. Bin noch ratlos. So hätte ich den Code eingerückt. Ob das gut oder schlecht ist, weiß ich nicht. Nur sehen kann ich meinen Fehler leider im Moment noch nicht. Bitte deshalb noch einmal um Hilfe.


----------



## virtual12 (30. Dez 2015)

Was ist denn hier konkret falsch?


----------



## MWin123 (30. Dez 2015)

Ich hab dir den Code mal richtig eingerückt.


```
public static void main(String[] args) {
    int n = Integer.parseInt(args[0]);
    int i = 1;
    double Zufall = Math.random();

    while (i <= n) {
        System.out.println(Zufall);
        Zufall = Math.random();
        i = i + 1;
    }

    double sum = 0;
    sum = sum + Zufall;
    double Average = sum / n;
    System.out.println("Average is: " + Average);
}
```
So siehst du auch wo die while Schleife aufhört.
Du weist `Zufall` zwar immer einen neuen Wert zu, addierst ihn aber nicht zur Summe. Du addierst nur weiter unten den letzten Wert zur Summe.


----------



## virtual12 (30. Dez 2015)

Das heißt, ich muss sum = sum+Zufall/n schreiben?


----------



## MWin123 (30. Dez 2015)

Nein.

Du musst jede Zufallszahl zur Summe addieren und nicht nur die letzte.


----------



## JStein52 (30. Dez 2015)

Nein. Du musst innerhalb der Schleife aufaddieren und hinter der Schleife dann durch die Anzahl der Werte dividieren !!


----------



## virtual12 (30. Dez 2015)

Also meine Schleife sieht jetzt so aus:

```
while (i <= n) {
            System.out.println(Zufall);
            Zufall = Math.random();
            i = i + 1;
            double sum = 0;
            sum = sum + Zufall;
      }
```
Ich verstehe aber leider immer noch nicht, wie ich alle Zufallszahlen addieren kann und nicht nur die letzte? Ich weiß einfach nicht , wie ich das aufschreiben kann.


----------



## MWin123 (30. Dez 2015)

Wie würdest du das jetzt ausgeben?
Du hast ja außerhalb der Schleife keinen Zugriff auf `sum`.

`double sum = 0;` muss außerhalb der Schleife stehen.


----------



## virtual12 (30. Dez 2015)

Okay, aber wenn das außerhalb der Schleife steht, wie kann ich dann innerhalb der Schleife addieren?


----------



## virtual12 (30. Dez 2015)

Und wie kann ich alle Zufallszahlen addieren?


----------



## JStein52 (30. Dez 2015)

Das tust du doch jetzt !!!

```
sum = sum + Zufall;
```

Am Ende steht in sum die Summe !!


----------



## Bitfehler (30. Dez 2015)

```
while (i <= n) {                                   //Schleifenbedingung
            System.out.println(Zufall);       //Gebe die Var Zufall aus
            Zufall = Math.random();          // Zufall = einer zufälligen Zahl
            i = i + 1;                                ///Erhöhe i
            double sum = 0;                     //Setzte sum auf 0
            sum = sum + Zufall;               //addiere auf sum Zufall
      }
```

Aktuell durchläufst du die Schleife n-Mal. Bei jeden Durchlauf werden die fünf Zeilen Code ausgeführt. Also wird bei jedem Durchlauf die Variable sum auf 0 gesetzt und dann der neue zufällige Wert addiert. Da du die Summe aber immer wieder auf 0 setzt, verlierst du dein bisherigen Ergebnis. So weit nachvollziehbar?

Wenn du die Zeile double sum = 0 außerhalb deiner Schleife hast, ist die Variable sum innerhalb der Schleife vorhanden und kann verwendet werden. Wenn man nun noch auf das Setzten von sum = 0 innerhalb der Schleife verzichtet, kannst du wie gewünscht addieren. Du behältst das dein Zwischenergebnis und rechnest da n-Mal einen Wert drauf.

Ändere doch bei Gelegenheit deine Variable Zufall in zufall. Danke


----------



## virtual12 (30. Dez 2015)

Okay, das ist von deinen Erläuterungen nachvollziehbar, aber ich bin immer noch unsicher in der Schreibweise. Habe jetzt folgendes, was aber immer noch nicht stimmt. 

```
public class AverageZufall {
public static void main(String[] args) {
        int n = Integer.parseInt(args[0]);
        int i = 1;
        double zufall = Math.random();
        double sum = 0;

        while (i <= n) {                                   //Schleifenbedingung
            System.out.println(zufall);       //Gebe die Var Zufall aus
            zufall = Math.random();          // Zufall = einer zufälligen Zahl
            i = i + 1;                                ///Erhöhe i
                                 //Setzte sum auf 0
            sum = sum + zufall;               //addiere auf sum Zufall
      }


        double Average = sum / n;
        System.out.println("Average is: " + Average);
    }
}
```

Was mache ich jetzt noch falsch? Oder habe ich deine Erklärung völlig falsch verstanden?


----------



## Bitfehler (30. Dez 2015)

Ich würde dir noch folgendes nahe legen:

double zufall = 0
Deins ist auch richtig, doch der erste zufällige initale Wert wird von dir nicht verwendet, da er in der Schleife überschrieben wird.
Tausche doch mal die ersten beiden Zeilen innerhalb deiner Schleife. Das wird dir beim Nachvollziehen helfen. Dann wird nämlich die neu generierte Zahl ausgegeben. Ändert aber nichts an der Logik.
Die Variable Average klein schreiben.
Noch Fragen oder ungewolltes Systemverhalten?


----------



## JStein52 (30. Dez 2015)

Warum meinst du dass es nicht stimmt ? Was passiert ?



Bitfehler hat gesagt.:


> Tausche doch mal die ersten beiden Zeilen innerhalb deiner Schleife



Genau, das ist jetzt noch dein Fehler.


----------



## virtual12 (30. Dez 2015)

Es funktioniert jetzt. Ich musste nur die ersten beiden Zeilen der Schleife tauschen. Vielen Dank für eure Hilfe hier!!


----------

