Zufallszahlen



  • Da dies mein erster Eintrag ist, erstmal; Hallo zusammen.

    ich fange gerade an mir C++ beizubringen und habe eine Frage bezüglich Zufallszaheln.

    Ich habe folgende Zeilen geschrieben um mir Zufallszahlen zwischen 0 und 1 ausgeben zu lassen.

    #include <iostream>
    #include <time.h>
    #include <stdlib.h> 
    #include <cstdlib>
    #include "rand_funktion.h"
    
    double rand01(void)
    {
    
    	srand (time(0));
    
    	return((double)rand()/RAND_MAX);
    }
    

    Nun würde ich mir gerne 100 Zufalsszahlen ausgeben lasse.
    Ich könnte es sicher auch so machen:

    int main( void )
    {
        int i = 0;
    
        srand(time(0));
    
        for(i=0 ; i < 100; ++i )
          { 
            cout<< ((double)rand()/RAND_MAX )<<endl; 
    
          } 
    }
    

    aber ich würde einfach gerne auf die obere Funktion zugreifen.
    Wie mach ich das am besten ?

    Gruß
    malo



  • Einfach srand (time(0)); aus Deiner Funktion herauslösen.



  • int main()
    {
        for(int i=0 ; i < 100; ++i )
          { 
            cout<<rand01()<<"\n"; 
    
          } 
    }
    

    Bevor jetzt wieder das "gemotze" losgeht. Das war seine Frage und das ist die Antwort darauf. Das ihr das nicht so macht ist mir auch klar und das in dem Code noch C Artefakte sind auch.



  • Motzt ja keiner 🙂
    Aber gewisse Sachen sollte man auch noch erwähnen:

    Header-Dateien mit Endung .h in spitzen Klammern sind alte C-Header. <math.h> wird in C++ zu <cmath> , <time.h> zu <ctime> .
    <stdlib.h> brauchst du nicht, hast doch <cstdlib> eingebunden.

    Btw.: Wie bringst du dir C++ bei?



  • Danke für eure Antwort.
    Aber brauch ich srand ((time(0)) nicht um den Generator zu initialisieren ?

    Ich habe das jetzt so verstanden das srand an der falschen Stelle steht. Weil wenn es in der Funktion steht, würde ich ja immer die selben Nummern bekommen, oder?

    Ach ja , du meinst im Code wären C Artefakte.
    Ich versuche mir gerade C++ selbst mit einem Buch (breymann: Der Programmierer) und Internet Tutorials beizubringen und ich mache das einfach so wie ich es lesen.
    Mach ich da grundlegend was falsch?



  • Doch, genau das ist der Zweck von srand(). Du initialisierst den Generator, dies geschieht jedoch nur einmal! Darum muss srand() aus der Funktion raus und vor dem Funktionsaufruf gepackt werden.

    Das Buch ist ein gutes Buch, das dir auch sicher einige empfehlen werden. Tutorials sind eher mit vorsicht zu genießen, da viel schlechter Code im Internet herumschwirrt und du wahrscheinlich nicht beurteilen kannst, ob dieses Tutorial nun gut oder schlecht ist.
    Bleib bei deinem Buch, das ist sicher das Beste.
    Noch ein Tipp: Lese viel in diesem Forum, das hat mir unheimlich viel geholfen.



  • Dankeschön.

    Auf die Gefahr hin euch zu langweilen, aber mir stellt sich gerade die Frage wohinich ich dann die srand Funktion schreiben soll.

    Wenn ich den Code so schreibe:

    #include <iostream>
    #include <ctime>
    #include <cstdio>
    #include <cstdlib>
    #include "rand_funktion"
    
    using namespace std; 
    
    double rand01(void)
    
    {
    
    	//srand(time(0));
    
    	return((double)rand()/RAND_MAX);
    }
    
    int main()
    {
        for(int i=0 ; i < 100; ++i )
          {
            cout<<rand01()<<"\n";
    
          }
    }
    

    bekomme ich ja immer die gleichen 100 Zahlen.



  • srand() an den Anfang der main(), dann nie wieder irgendwo aufrufen.



  • Einmal am Anfang der main.

    Edit: zu langsam 😞



  • Innerhalb der main und vor die Schleife:

    int main()
    {
        srand( time( 0 ) );
        for(int i=0 ; i < 100; ++i )
          {
            cout<<rand01()<<"\n";
    
          }
    }
    


  • Danke.

    Ich hatte das schonmal probiert und eine fehlermeldung erhalten.
    Aber jetzt klappts.



  • Hallo,
    ich nochmal.

    Ich wollte jetzt mal eine Zufallszahl zwischen zwischen einem Minimum und einem Maximum erzeugen und zwar so.

    #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;
    
    	if (dif>0) 
    
    		return(rand()%dif+min);
    
    	else return(min);
    }
    

    Wenn ich jetzt aber für min und max zwei Zahlen nehme und mir den Zufallswert ausgeben lassen will, heißt der fehler das randMaxMin immer zu wahr wird. Also bekomme ich immer eine 1.
    Woran kann das liegen.



  • 😕

    Btw: Wenn du C++11 nutzen darfst/kannst, schaue dir mal den Header <random> an.



  • Zeig mal die main.



  • int min = 1;
    int max = 1000;
    int main()
    
    {
    
    	srand( time( 0 ) );
    
            cout<<randMinMax<<"\n";
    
          return 0; 
    }
    


  • 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() ?

Anmelden zum Antworten