2016-03-21 10 views
1

Also soll ich hundert zufällige Zahlen zwischen 1-100 generieren. 20 davon sollen im Bereich von 1-100 generiert werden, die anderen 80 sollen im Bereich von 40-70 liegen. Ich sollte auch Funktionen erstellen, um die Durchschnitts- und Standardabweichungen der Zahlen zu berechnen.Berechnen mit zufällig generierten Zahlen in C++

Beachten Sie, dass dies ohne die Verwendung von Arrays erfolgen soll.

Mein Problem ist, dass ich nicht sicher bin, wie ich mein Programm dazu bringen kann, sich an die erzeugten Zahlen zu erinnern, damit ich sie für die Berechnungsfunktion verwenden kann. Alles, was ich jetzt wirklich tun kann, ist, sie mithilfe von Loops auszudrucken. Ich weiß nicht, wie man die generierten Zahlen für die Berechnung nutzbar macht.

Irgendwelche Tipps, und nähere ich mich dem richtigen Weg?


#include <iostream> 
#include <cstdlib> 
#include <cmath> 
#include <time.h> 
using namespace std; 


int getOutlierScore(); 
int getNormalScore(); 


int main() 
{ 
    srand (time(NULL)); 
    cout << "The scores are as follows:" <<endl; 

    for (int i = 1; i <= 20; i++) 
    { 
     cout << i << ". " << getOutlierScore() <<endl; 
    } 

    for (int i = 21; i <= 100; i++) 
    { 
     cout << i << ". " << getNormalScore() <<endl; 
    } 

    return 0; 
} 

int getOutlierScore() 
{ 
    int outlier; 
    outlier = rand() % 100 + 1; 
    return outlier; 
} 

int getNormalScore() 
{ 
    int max = 70, min = 40; 
    int normalScore; 
    normalScore = rand() % (max - min) + min; 
    return normalScore; 
} 
+4

Haben wir Schokolade, wenn wir deine Hausaufgaben machen? –

+0

Frag mich niemanden, die Arbeit für mich zu tun, ich frage nur, ob jemand mich über eine Methode der Übertragung dieser Werte zu einer Berechnungsfunktion ohne die Verwendung eines Arrays, –

+0

können Sie sagen können 'std :: Vektor'? – muXXmit2X

Antwort

0
class Statistics { 
private: 
    int count; 
    double sum; 
    double sum2; 
public: 
    Statistics():count(0), sum(0),sum2(0){} 
    void clk(float f);   // clock in data value 
    float ave();    // get mean 
    float std();    // get standard deviation 
}; 

inline void Statistics::clk(float f) 
{ 
    count++; 
    sum += f; 
    sum2 += f*f; 
} 

inline float Statistics::ave() 
{ 
    return float(sum/count); 
} 

inline float Statistics::std() 
{ 
    return (float)sqrt((double)((sum2 - sum*(sum/count))/(count - 1))); 
} 

Dies sollte Ihnen einen Start geben. Sie müssen nichts speichern. Einfach die 100 Zufallswerte mit einem Statistikobjekt mit clk (r) einbinden. Nachdem Sie fertig sind, können Sie die ave() und std() aufrufen, um die Ergebnisse zu erhalten.

1

Nun, ich möchte nicht die Antwort auf Ihre Hausaufgaben posten. Ich führe Sie nur dazu, wie Sie das erreichen können.

Bis jetzt geht es Ihnen gut. Erstens, um die Standardabweichung zu berechnen, müssen Sie zuerst den Mittelwert finden. Das bedeutet, dass Sie den Durchschnitt berechnen müssen.

Jetzt benötigen Sie kein Array, um den Durchschnitt für eine Reihe von Zahlen zu berechnen. Verfolgen Sie die Gesamtsumme dieser zufälligen Werte in einer Variablen sagen sum.

Sie müssen alle Werte aus den Funktionen getOutlierScore() und getNormalScore() in diese Variable einfügen.

So am Ende der Schleife erhalten Sie die Gesamtsumme mit den angegebenen Bedingungen von "20 von ihnen sollen im Bereich von 1-100 generiert werden, und die anderen 80 sollen in der sein Bereich von 40-70. "

Jetzt müssen Sie nur noch den Mittelwert und dann die Standardabweichung finden. Lass es mich wissen, wenn du feststeckst. (Üben helfen Ihnen lernen, Viel Glück !!)

Edit: Wie @Doug wies darauf hin, müssen Sie auch die Summe der Quadrate. Behalte das in einer anderen Variable im Auge.

+1

Auch müssen Sie die Summe der Quadrate jedes zufälligen Wertes verfolgen. – doug

+0

@doug Danke, ich habe es bearbeitet. Schätze, ich werde alt, fast hätte ich die Formel der Standardabweichung vergessen :) –

+1

Du meintest 'getOutlierScore()' und 'getNormalScore()';) – muXXmit2X

0

Nun, ich habe total vergessen, dass Sie tatsächlich die Standardabweichung berechnen können, ohne die Zahlen tatsächlich zu speichern. Wenn Sie sie jedoch speichern möchten, um sie beispielsweise zu veranlassen, können Sie eine verknüpfte Liste verwenden. Dies ist kein Array und sollte daher erlaubt sein.

Eine einfache verkettete Liste (es gibt elegantere Lösungen gibt, aber dies ist ziemlich einfach) könnte wie folgt aussehen:

struct Node 
{ 
    int val; 
    Node* next; 

    Node(int val) 
    { 
     this->val = val; 
     next = NULL; 
    } 

    void add(int val) 
    { 
     Node* cur = this; 
     while (cur->next) 
     { 
      cur = cur->next; 
     } 
     cur->next = new Node(val); 
    } 

    void deleteFromHere() // delete all Nodes after this one 
    { 
     while (next) 
     { 
      Node *cur = this; 
      Node * last; 
      while (cur->next) 
      { 
       last = cur; 
       cur = cur->next; 
      } 
      delete last->next; 
      last->next = NULL; 
     } 
    } 
}; 

Und wie so verwenden:

int main(void) 
{ 
    Node head(getOutlierScore()); 

    for (int i = 0; i < 19; i++) 
    { 
     head.add(getOutlierScore()); 
    } 

    for (int i = 0; i < 80; i++) 
    { 
     head.add(getNormalScore()); 
    } 

    Node* cur = &head; 
    while (cur->next) 
    { 
     cout << cur->val << ". "; 
     cur = cur->next; 
    } 
    cout << endl; 

    // calculate standard deviation and average here 

    head.deleteFromHere(); 
} 

Durch die Weg C++ 11 kam mit dem <random> Header, der über std::rand bevorzugt wird. Die Verwendung ist ziemlich einfach. Schau dir das an:

int GetRandom(int min, int max) 
{ 
    static random_device rd; // create random device only once per program run 
    mt19937 mt(rd()); // create number generator 

    uniform_int_distribution<int> dist(min, max); // define range for the values [min;max] 
    return dist(mt); // create a random value in range 
} 
Verwandte Themen