Mittelwert berechnen

virtual12

Aktives Mitglied
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:
Code:
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);
}
}
 
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.
 
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.
 
Dann addiere doch mal die Zufallswerte 😉

Code:
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);
}
}
 
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.
 
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.
 
Sorry, habe den Code vergessen einzufügen
Code:
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);
}
}
 
Code:
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.
 
Ich hab dir den Code mal richtig eingerückt.

Java:
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.
 
Also meine Schleife sieht jetzt so aus:
Code:
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.
 
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.
 
Code:
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
 
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.
Code:
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?
 
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?
 

Zurück
Oben