Keine negativen Zufallszahlen



  • Hallo zusammen,
    könnte mir jemand einen Hinweis geben, warum mein Programm keine negativen Zufallszahlen ausspuckt?

    #include <iomanip>
    #include <sstream>
    #include <math.h>
    #include <string>
    #include <stdlib.h>
    #include <time.h>
    #include <fstream>
    #include <iostream>
    #include <cstdlib>
    #include <time.h>
    
    using namespace std;
    
    double x = -10 , y = 10;
    double Distanz1;
    
    double pi = 3.1415;
    
    int main(){
    
         srand((unsigned)time(NULL));    //Zufallsgenerator wird jedes mal neu initialisiert
    
         double r1[2] =  {double(rand ()) / double((y + 1.000) - x) + x  , double(rand ()) / double((y + 1.000) - x) + x};
         Distanz1 = atan(r1[1] / r1[0] ) * 180.000/pi; 
    
         cout << r1[0] << " " << ","  << " " << r1[1] << endl;
    
         cout << "\n";
    
         cout << Distanz1 << endl;
    
         return 0;
    
    }
    

    Ich habe srand() verwendet und das Programm oft genug wiederholt, um auszuschließen, dass zufällig positive Zahlen generiert werden. Achja, die Zufallszahl soll ein double sein.

    Danke im voraus!!! :p



  • rand() Considered Harmful.

    Wenn du gleichverteilte double s zwischen z.B. -1 und 1 haben möchtest, dann kann man das z.B. so schreiben:

    #include <iostream>
    #include <random>
    
    int main()
    {
        std::random_device seeder;
        std::mt19937_64 engine{seeder()};
        std::uniform_real_distribution<double> dist{-1.0, 1.0};
    
        for(int i = 0; i < 10; ++i)
            std::cout << dist(engine) << '\n';
    }
    


  • Queiser schrieb:

    Hallo zusammen,
    könnte mir jemand einen Hinweis geben, warum mein Programm keine negativen Zufallszahlen ausspuckt?

    Nun, da rand() nur nicht-negative Zahlen zwischen 0 und RAND_MAX ausspuckt, können deine Brechnungen wenn ich das
    richtig sehe nur negativ werden, wenn rand() eine Zahl < 210 zurückgibt. Bei hinreichend großem RAND_MAX ist das
    möglicherweise einfach nur zu unwahrscheinlich.

    Ansonsten solltest du dir die Antwort von Fytch zu Herzen nehmen, auch wenn sie nicht die Frage beantwortet, die du
    gestellt hast. Das auf Basis von rand() mit korrekter Verteilung selbst zu stricken, besonders mit double s, ist nämlich
    schwieriger als du eventuell erahnst.



  • Danke für eure Antworten.

    Mir war nicht bewusst, dass rand() nur positive Zahlen ausgibt.
    @Fytch
    Für das <random> müsste ich erst mal die Bibliothek durchstöbern, um mir das richtige Paket runter zuladen, worin ich eigentlich noch ziemlich Probleme hab.

    Da ich mit c++ auch noch relativ schlecht vertraut bin, sagt mir so etwas wie
    random_device seeder und mt19937 nichts.

    Ich dachte, dass die Erzeugung von positiven und negativen Zufallszahlen auch mit den Mitteln möglich ist, die ich in dem geposteten Programm habe.

    Naja gut, da muss ich noch etwas recherchieren.

    Trotzdem Danke. 👍



  • Wäre

    (double Zufallszahl) * (-1)^(int Zufallszahl)

    nicht auch eine Lösung?


  • Mod

    Queiser schrieb:

    Wäre

    (double Zufallszahl) * (-1)^(int Zufallszahl)

    nicht auch eine Lösung?

    Eine Lösung, aber für welches Problem? Die bestmögliche Lösung wurde genannt. random brauchst du nirgendwo runterladen, das ist ein Standardteil von C++. Wahrscheinlich hinkst du aber dem Standard um ein halbes Jahrzehnt hinterher. Probier mal einen Compilerschalter wie -std=++11 (oder besser: -std=c++14) oder ähnliches, um die Sprachstandards von 2011 bzw. 2014 zu aktivieren.



  • Queiser schrieb:

    Für das <random> müsste ich erst mal die Bibliothek durchstöbern, um mir das richtige Paket runter zuladen, worin ich eigentlich noch ziemlich Probleme hab.

    Für <random> brauchst du gar nichts herunterzuladen, das ist im C++-Standard drin. Seit 2011 zumindest. Wir haben jetzt Ende 2017. Das heißt, wenn du keinen uralten Compiler hast, brauchst du nichts weiter zu tun. Wenn du noch einen Uralt-Compiler nutzt, solltest du den updaten. (vielleicht musst du deinem Compiler auch einfach nur mitteilen, dass er den C++-Standard von 2011, 2014 oder 2017 nutzen soll und nicht den von 1998 (oder 2003).

    Alle anderen Lösungen machen es nur komplizierter.



  • Queiser schrieb:

    Ich dachte, dass die Erzeugung von positiven und negativen Zufallszahlen auch mit den Mitteln möglich ist, die ich in dem geposteten Programm habe.

    Klar geht das. Du benutzt da ja "nur" C und da geht das ja auch.

    (2.0*rand()/RAND_MAX - 1.0) // liefert Pseudozufallszahlen zwischen -1.0 und 1.0
    

    ^Die Reihenfolge (2.0 zuerst) ist durchaus wichtig, damit die Berechnung als double erfolgt
    ^

    Aber nimm besser den Tipp von Fytch an.



  • Ja, ich denke der compiler ist das Problem.

    Ich werde dies morgen, sobald ich wieder am entsprechenden PC sitze, ausprobieren.

    Danke für die Tipps.



  • Wo muss ich diesen compilerschalter für c++14 oder c++17 denn aktivieren?

    Muss dieser im Programm stehen oder als Befehl in meinem Texteditor kwrite angegeben werden? Und wie muss der Befehl aussehen?

    Das Kommando "cnf g++14" wird beispielsweise von meinen Texeditor nicht gefunden.

    Ich habe im Netz zwar viel drüber gefunden, was ein Compiler ist, aber nicht, wie man diesen aktiviert oder verwendet. Bzw. es wird nur ein Beispiel gemacht für den von mir bereits verwendeten compiler zum Aufrufen.

    linux-ago9>g++ Dateiname.cpp
    Aber unter diesem Befehl wird <random> nicht angenommen.

    Frustrierend...... 😞


  • Mod

    g++ Dateiname.cpp
    

    ->

    g++ Dateiname.cpp -std=c++11
    

    Am besten auch gleich:

    g++ Dateiname.cpp -std=c++11 -Wall -Wextra
    


  • Vielen Dank!!!

    Das ist GENAU das, wonach ich gesucht habe.

    Perfekt. 👍 👍 👍 👍 👍 👍


Anmelden zum Antworten