Zufallszahlen von 0-9 erzeugen und der Reihenfolge nach ordnen



  • Hallo zusammen,
    wir haben vor kurzem in der Informatik Vorlesung folgendes Programm geschrieben:

    #include <iostream>
    #include <stdlib.h>
    using namespace std;
    	int myArray[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };								// = {0]
    																					// for loop myArray...=0...
    
    
    int main()
    {	
    	int z;
    	srand(55);																		// Initialisierung des Zufallsgenerators
    																					//Zufallszahlen erzeugen und eintragen
    	
    
    	for (int i = 0; i < 1000000; i++)
    	{
    		z = rand() % 10;
    		myArray[z] ++;																// Zähler eins hoch
    	}
    
    	for (int i = 0; i < 10; i++)
    	{
    		cout << i;
    
    		for (int j = 0; j <= myArray[z] / 10000; j++)
    		{
    			cout << ".";
    		}
    		cout << endl;
    	}
    	
    
    
    	system("PAUSE");
    	return 0;
    }
    

    Ich blicke da nicht ganz durch, "wo das Programm was macht".
    Kann mir das jemand erklären?



  • Das Programm macht alles in main.



  • @jand61 Das Programm erstellt ein Histogramm über die Verteilung der Zufallszahlen.

    Da wird nichts sortiert.



  • @jand61

    • in zeile 2 bindet das programm fälschlicher weise den c-header stdlib.h ein
    • in zeile 4 wird fälschlicher weise ein globales array definiert und sinnloser weise mit nullen initialisiert
    • in zeile 15 - 19 werden zufallszahlen aus [0, 10) erstellt (zeile 17) und deren häufigkeit gezählt (zeile 18)
    • in zeile 21 - 30 werden der wert der zufallszahl (zeile 23) und direkt danach eine der häufigkeit in prozent entsprechende anzahl an punkten (zeile 25 - 27) sowie ein zeilenumbruch (zeile 29) ausgegeben
    • in zeile 34 ruft das programm fälschlicher weise die funktion systemmit dem parameter "PAUSE" auf, um das schließen des konsolenfensters zu verhindern.

    ich hoffe, ich konnte dir dabei helfen, das programm zu verstehen.



  • Vielen Dank!
    Danke für das Aufklären, das Array am Anfang hat mich nämlich sehr verwirrt da ich nicht verstanden hab, warum das einfach so mit Nullen gefüllt wird. Wie funktioniert der Schritt in Zeile 18 genau mit dem Zählen der Häufigkeit? Wird z dann in das Array gepackt?



  • @jand61 der wert der der zufallszahl entsprechenden position im array wird um 1 erhöht (deshalb wird das array mit nullen initialisiert, was aber eigentlich überflüssig ist). also wenn jetzt bspw. die zahlen 2,5,2,3,4,5,6,7,6,5,4 erzeugt werden, hat das array die werte {0, 0, 2, 1, 2, 3, 2, 1, 0, 0}. also wenn ich mich jetzt nicht irgendwo vertan habe.



  • Das Programm erzeugt übrigens bei jedem Aufruf immer dieselben "Zufallszahlen" - Stichwort: srand seed.



  • @Wade1234 sagte in Zufallszahlen von 0-9 erzeugen und der Reihenfolge nach ordnen:

    (deshalb wird das array mit nullen initialisiert, was aber eigentlich überflüssig ist).

    Überflüssig ist es nicht.
    Da hier aber das Array (warum auch immer) global angelegt wird, wird es implizit mit 0 initialisiert.

    Wird es als lokale Variable angelegt, ist die explizite Initialisierung nötig.



  • Es reicht dann aber

    int myArray[10] = { 0 };
    

    bzw. sogar (ab C++ 11}

    int myArray[10] = {};
    

    (wie auch im Kommentar oben im Code angedeutet)
    Es werden dann automatisch alle restlichen Arraywerte mit dem Defaultwert (0) initialisiert.



  • Ok...jetzt ist mir das ganze um einiges klarer geworden. Danke euch für die Hilfe! 🙂



  • Wir sind doch bei C++. Warum nicht <random> nutzen?


  • Mod

    @Zhavok sagte in Zufallszahlen von 0-9 erzeugen und der Reihenfolge nach ordnen:

    Wir sind doch bei C++. Warum nicht <random> nutzen?

    Gutartige Spekulation: Weil der Lehrer sich das Einführen von zwei oder mehr relativ schwer verständlichen Konzepten sparen möchte, bloß um ein paar Zufallszahlen zu erzeugen, die nicht zentrale Komponente der Aufgabenstellung sind.

    Was wahrscheinlich die Wahrheit ist: Weil der Lehrer nie davon gehört hat. Typisches Anfänger-C, in dem printf durch cout ersetzt wurde.


Anmelden zum Antworten