Zufallszahlen



  • Argumentübergabe an Funktion?!



  • Hallo malo66.

    Momentan vermengst Du zwei Konzepte in Deinem Code.
    Zum einen benutzt Du Variablen im globalen Scope, um Deine Funktionen zu parametrisieren, zum anderen benutzt Du Funktionsparameter.

    Wenn Du globale Variablen benutzt brauchst Du keine Parameter

    int min = 1;
    int max = 1000;
    
    int randMinMax ()  // randMinMax gibt einen int zurueck und erwartet keine Paramenter
    {
      int dif= max-min+1; // max und min sind beide ausserhalb (global) definiert
      if (dif>0)
        return(rand()%dif+min);
      else return(min);
    }
    
    void f(){
      int z = randomMinMax();  // Aufruf (keine Paramter)
      // ....
    }
    

    Generell kommen globale Variablen selten vor.
    Eine zweite Möglichkeit wäre Parameter beim Aufruf mitzugeben

    int randMinMax (int min, int max)  // min und max werden beim aufruf übergeben
    {
      int dif= max-min+1; 
      if (dif>0)
        return(rand()%dif+min);
      else return(min);
    }
    
    void f(){
      int lottozahl = randMinMax(1,49);  // Aufruf (zwei Parameter)
      //....
    }
    

    Beachte bitte, dass Du beim Aufrufen der Funktion immer die Runden Klammern brauchst. Dass Du die vergessen hast ist der Hauptgrund, dass Dein Code kompiliert, aber nicht das richtige ausgibt. (Es spielt auch noch eine implizite Umwandlung eine Rolle, aber das ist nicht so wichtig).



  • Ah, das habe ich nicht bedacht. Ich habe immer versucht die Variablen in die funktion zu setzen aber das hat nie geklappt.
    Das min max bei bei Funktionsaufruf schon da sind, habe ich ganz vergessen
    Super.

    Danke nochmals.
    Das ganze sieht jetzt so aus

    #include <iostream>
    #include <time.h>
    #include <stdio.h>
    #include <cstdlib>
    #include "rand_funktion.h"
    
    using namespace std; 
    
    int randMinMax (int min, int max)
    
    {
    	int dif= max-min+1;
    	int erg =(rand()%dif+min);
    
    	if (dif>0) 
    
    		return(erg);
    
    	else return(min);
    }
    
    int main()
    
    {
    
    	srand( time( 0 ) );
    
            cout<<randMinMax(1,1000)<<"\n";
    
          return 0; 
    }
    


  • Um das ganzenoch weiter zu treiben, wollte ich mal versuchen die ausgegebenen Zahlen in einer *.txt Datei zu speichern.

    Ich habe das folgendermaßen versucht

    #include <iostream>
    #include <time.h>
    #include <stdio.h>
    #include <cstdlib>
    #include "rand_funktion.h"
    #include <fstream>
    
    using namespace std; 
    
    int randMinMax (int min, int max)
    
    {
    
    	int dif= max-min+1;
    	int erg =(rand()%dif+min);
    
    	if (dif>0) 
    
    		return(erg);
    
    	else return(min);
    }
    
    int main()
    
    {
    
    	srand( time( 0 ) );
    
           for(int i=0 ; i < 100; ++i )
           //cout<<randMinMax(1,1000)<<"\n";
    
    		string ziel;
    		ofstream ziel("test1.txt");
    		ziel.open("test1.txt", ios::binary | ios::out);
    		ziel<<"hallo welt"<<randMinMax(1,100)<<endl;
    		 ziel.close();
    
       return 0; 
    }
    

    Es wird sogar eine Datei mit dem Namen test1.txt erstellt, leider jedoch ohne Inhalt. Woran kann das liegen?

    ofstream ist doch für die Ausgabe?


  • Mod

    Lass mal Zeile 36 (und gerne auch 38) weg und schimpf wütend über denjenigen, der dir das so beigebracht hat. Wenn du beides erledigt hast, sollte es funktionieren.



  • Wenn Du doch das Buch von Breymann hast, dann schau doch lieber erstmal dort rein, bevor Du hier fragst.

    • Was soll der string ziel?
    • Wie sieht die for-Schleife aus, wenn der Schleifenkörper mehrere Anweisungen enthält?
    • In dem Zusammenhang: weisst Du warum das eigentlich kompiliert, obwohl Du sowohl einen string als auch einen ofstream mit dem gleichen Namen hast?
    • Du willst 100 Zufallszahlen in eine Datei schreiben, warum dann die Datei 100 mal öffnen?
    • Was macht der Konstruktor von ofstream, den Du benutzt?
    • Warum dann noch open?
    • Wieso binary und ios::out ?
    • Wieso close() ?


  • Ok, es funktioniert teilweise. Ich möchte ja 100 zahlen ausgeben und speichern, so wird jedoch nur eine Zahl gespeichert.

    Ich habe das eigentlich aus dem Buch, aber ich scheine das etwas durcheinander gebracht zu haben.



  • Der strings ist wohl unnötig wenn ich die Klammern setzte. ups
    ofstream ist der Datentyp für Ausgabedateien und das open habe ich falsch übernommen, das kommt wohl nur bei Eingabe.

    ios::binary | ios::out steht so im Buch, aber das gilt wohl nur für Kopien.
    Da hatte ich einfach nicht richtig hingeschaut.

    int main()
    
    {
    
    	srand( time( 0 ) );
    
    	//	cout<<randMinMax(1,100)<<"\n";
    
    		ofstream ziel("test1.txt");
    
    		for(int i=0 ; i < 100; ++i )
           {
    		ziel<<randMinMax(1,100)<<endl;
    		}
    
       return 0; 
    }
    

    Jetzt funktioniert es aber 🙂



  • ...



  • malo66 schrieb:

    Jetzt funktioniert es aber 🙂

    Ordentlich formatiert, ist es eine schöne und einfache main() mit 4 oder 5 Zeilen.
    Das freut den Leser! 🙂

    Übrigens: Es besteht durchaus die Chance, dass Herr Prof. Breymann hier mitliest und auch antwortet.

    Na dann bin ich gespannt, was als nächstes auf Deiner Lernliste steht!

    Cheers,
    FW


Anmelden zum Antworten