Unterschiedliches Ergebnis Debug - Run



  • Hallo C++ Community,

    ich verwende Debian + Anjuta IDE, um C++ zu lernen.

    Wenn ich eine Programm im Debugger ausführe, komme ich zu einem anderem
    Ergebnis, als wenn ich es auf der Console starte (Run).

    
    #include <iostream>
    #include <string>
    #include <array>
    #include <stdlib.h>
    using namespace std;
    
    
    
    
    	string name(string name1) {
    
    	cout << "Welcome to the braintrain! \n";
    	cout << "Please give me your Name: \n";
    	cin >> name1;
    	return name1;
    
    }
    
    
    int choice_difficult (int signs) {
    
    	int signs_no;
    	cout << "How many signs to remark \n";
    	cin >> signs_no;
    	return signs_no;
    
    }
    
    int rand(int rand_dig) {
                    
    	int func_dig;
    
    
      /* initialize random seed: */
      srand (time(NULL));
    
      /* generate secret number between 0 and 255: */
      func_dig = rand() % 255 + 0;
    
     //        
     return func_dig;
    
    }
    
    
    int main()
     
    
    {
    	
    	// string playername;
        // playername = name(playername);
    	//std::cout << playername;
    
    	    
    	// Call choice
        int number_of_digits;
    	int counter;
        number_of_digits  = choice_difficult (number_of_digits);
    
    	//cout << "Number of digits" << '\n';
    	//cout <<  number_of_digits << '\n';
        int IntegerArray1[number_of_digits];
    
    
    	// Call rand function
    
    
        counter = number_of_digits -1; 
    
    	do {
    
     
    	int rand_dig = rand(rand_dig);
    
    	IntegerArray1[counter] = rand_dig;
    
        cout << "Array= " << counter << " " <<  IntegerArray1[counter] << " " << rand_dig << endl;
    	counter = counter -1;
      
    
    	} while (counter > -1);
    		
       
    	
    	return 0;
    }
    
    
    

    Ergebnis Run:

    
    How many signs to remark 
    5
    Array= 4 12 12
    Array= 3 12 12
    Array= 2 12 12
    Array= 1 12 12
    Array= 0 12 12
    
    

    Ergebnis Debug mit Anjuta:

    
    How many signs to remark 
    5
    Array= 4 227 227
    Array= 3 93 93
    Array= 2 93 93
    Array= 1 174 174
    Array= 0 216 216
    
    
    

    Woran kann das liegen, bitte?

    Kurz zu mir: Älter als 55, keine Progammiererfahrung.
    Ich verwende zum Lernen das Buch Breymann C++ - eine Einführung.

    Gruß

    Piet



  • Dein srand auf Zeile 36 gehört da nicht hin. Damit wird der Zufallsgenerator initialisiert. Wenn Du das Programm aus der Konsole startest, wird es - Vermutung - so schnell ablaufen, dass time(NULL) jedes Mal den gleichen Wert zurückliefert. Der Zufallsgenerator wird also jedes Mal neu initialisiert und zwar jedes Mal mit demselben Wert, daher liefert er beim Ziehen auch jedes Mal dasselbe 'zufällige' Ergebnis; Du machst ja nur eine einzige Ziehung pro Initialisierung.

    Langer Rede kurzer Sinn:

    Mach Dein srand zu Beginn der main-Funktion, das gilt ganz allgemein: srand sollte man im Normalfall nur ein einziges Mal im Programmablauf aufrufen.

    Danach sollten verschiedene Programmläufe auch verschiedene Ergebnisse liefern.



  • Schau dir auch noch einmal Funktionen an, insbesondere Parameter von Funktionen. Wann benötigst du Parameter und wann nicht? All deine Funktionen haben je einen Parameter - aber benutzt wird der nicht (bzw in einem Fall wird er als lokale Variable missbraucht).



  • Hallo und vielen Dank für Eure Tipps!

    Verstanden.

    Gruß
    Piet



  • Eventuell wäre es auch eine gute Idee sich mal die Zufallsgeneratoren aus C++ (also C++11) anzuschauen. Du verwendest hier den Pseudozufallsgenerator aus C welcher nicht gerade das gelbe vom Ei ist. Seit C++11 gibt es neue Pseudozufallsgeneratoren aus dem Include <random>. Du kannst da zwischen verschiedenen Typen wählen und mit dem random_device bekommst du sogar einen echten Zufallsgenerator, der sich an den TRNG in deiner Hardware hängt (wenn du eine halbwegs moderne CPU hast). Es ist eine gewisse Einarbeitung nötig, lohnt sich aber.



  • @Piet Eine eigene Funktion namens rand ist auch doof.

    Funktioniert, weil du einen Parameter mit angibst, den du aber nie benutzt.

    Also benutze Namespaces richtig oder vergib andere Namen.


Anmelden zum Antworten