double Zufallszahlen



  • Hallo,

    ich möchte double Zufallszahlen generieren. Ich hab es folgendermaßen versucht:

    #include <cstdlib>
    #include <ctime>
    #include <random>
    
    double randgen(double a, double b){
        srand((unsigned)time(NULL));
        int randomnumber;
        randomnumber = rand()%b+a;
        double d = randomnumber;
        return d;
    }
    

    Es kommt immer diese Fehlermeldung:

    #ifndef __GXX_EXPERIMENTAL_CXX0X__
    #error This file requires compiler and library support for the \
    ISO C++ 2011 standard. This support is currently experimental, and must be \
    enabled with the -std=c++11 or -std=gnu++11 compiler options.
    #endif
    

    Ich vermute, es hat etwas mit meinem Compiler zu tun. Ich arbeite mit CodeBlocks. Compiler: GCC

    Gibt es einen Code den auch GCC kompiliert?


  • Mod

    codeblocks kennt Compilereinstellungen.



  • Und BTW: dein gezeigter Code braucht den Header random gar nicht.



  • Und was muss ich einstellen? Einfach einen anderen Compiler wählen? Welchen?


  • Mod

    c++chiller schrieb:

    Und was muss ich einstellen? Einfach einen anderen Compiler wählen? Welchen?

    Hast du die Fehlermeldung mal gelesen?



  • Rechtsklick auf das Projekt, build options, Compiler Flags -> Have MinGW follow the C++11 ISO C++ language standard -> Hacken.



  • (zu spät)Ok hast recht. Hab bei folgender option ein Häckchen gesetzt:

    Have g++ follow the C++11 ISO C++ Language standard
    

    Nun hab ich folgendes Problem:

    double randgen(double a, double b){
        srand((unsigned)time(NULL));
        double randomnumber;
        randomnumber = rand()%b+a; // ???
        double d = randomnumber;
        return d;
    }
    

    Fehlermeldung:

    C:\Users\Danish\Desktop\C_Programme\Uebung6\src\Randgen.cpp|9|error: invalid operands of types 'double' and 'double' to binary 'operator%'|
    

    Kann ich modulo bei doublezahlen anwenden?



  • c++chiller schrieb:

    Kann ich modulo bei doublezahlen anwenden?

    Nein.
    Deshalb hier der Weg wie man mithilfe des Headers <random> ordentliche Zufallszahlen generiert:

    #include <ctime>
    #include <random>
    #include <iostream>
    
    int main()
    {
        std::mt19937 gen(std::time(nullptr)); // Generator erstellen und seeden
        std::uniform_real_distribution<> dis(1, 2); // Verteilung generiert doubles im Intervall [1, 2]
        for (int n = 0; n < 10; ++n) {
            std::cout << dis(gen) << ' '; // eine Zahl generieren
        }
        std::cout << '\n';
    }
    

  • Mod

    c++chiller schrieb:

    Kann ich modulo bei doublezahlen anwenden?

    nein. Modulo arbeitet nur mit Integern. Für Gleitkommazahlen ist die Standardfunktion fmod zuständig.



  • Danke Natha.
    Aber wie kann ich die Zahl mit return zurückgeben? Versucht habe ich
    return dis(gen);


  • Mod

    camper schrieb:

    c++chiller schrieb:

    Kann ich modulo bei doublezahlen anwenden?

    nein. Modulo arbeitet nur mit Integern. Für Gleitkommazahlen ist die Standardfunktion fmod zuständig.

    Wobei das aber auch nicht helfen würde. Der ganzzahlige Rest einer Division (also modulo, egal ob % oder fmod) wird ja nicht magisch eine nicht-ganze Zahl, bloß weil der Dividend eine nicht-ganze Zahl ist. 8 modulo 3.5 ist immer noch 2.

    Die ganze Formel ist einfach falsch gedacht. Es ist eigentlich auch nicht schwer, eine halbwegs brauchbare Lösung hin zu bekommen, daher lasse ich den Threadersteller mal selber nachdenken. Wobei die allerbeste Lösung das ist, was Nathan gezeigt hat.


  • Mod

    SeppJ schrieb:

    camper schrieb:

    c++chiller schrieb:

    Kann ich modulo bei doublezahlen anwenden?

    nein. Modulo arbeitet nur mit Integern. Für Gleitkommazahlen ist die Standardfunktion fmod zuständig.

    Wobei das aber auch nicht helfen würde. Der ganzzahlige Rest einer Division (also modulo, egal ob % oder fmod) wird ja nicht magisch eine nicht-ganze Zahl, bloß weil der Dividend eine nicht-ganze Zahl ist. 8 modulo 3.5 ist immer noch 2.

    Der ganzzahlige Rest wird sicher nicht magisch nicht-ganzzahlig. fmod liefert aber gar nicht den ganzzahligen Rest 😉



  • Wie bekomme ich die Zahl mit return ausgegeben?


  • Mod

    camper schrieb:

    SeppJ schrieb:

    camper schrieb:

    c++chiller schrieb:

    Kann ich modulo bei doublezahlen anwenden?

    nein. Modulo arbeitet nur mit Integern. Für Gleitkommazahlen ist die Standardfunktion fmod zuständig.

    Wobei das aber auch nicht helfen würde. Der ganzzahlige Rest einer Division (also modulo, egal ob % oder fmod) wird ja nicht magisch eine nicht-ganze Zahl, bloß weil der Dividend eine nicht-ganze Zahl ist. 8 modulo 3.5 ist immer noch 2.

    Der ganzzahlige Rest wird sicher nicht magisch nicht-ganzzahlig. fmod liefert aber gar nicht den ganzzahligen Rest 😉

    Ähh, ja. Ich glaube, ich mach mir lieber mal schnell ein koffeeinhaltiges Heißgetränk. Trotzdem natürlich immer noch falsch aus den gleichen Gründen.


  • Mod

    c++chiller schrieb:

    Wie bekomme ich die Zahl mit return ausgegeben?

    Wie bekommst du denn andere Zahlen mit return ausgegeben?



  • c++chiller schrieb:

    Wie bekomme ich die Zahl mit return ausgegeben?

    Gar nicht



  • Ich möchte nebenbei noch anmerken dass eine einfache modulo-Operation ohnehin nicht die richtige Methode ist, um den Wertebereich der Zufallsfunktion von n möglichen Werten auf m Werte "runterzuskalieren". Zumindest dann nicht, wenn n nicht durch m teilbar ist, da die Zufallszahlen dann nicht mehr gleichverteilt sind.

    Beispiel:

    Ich habe Zufallszahlen von 0 bis 10, möchte aber welche von 0 bis 9. Jede Zahl zwischen 0 und 10 tritt mit gleich hoher Wahrscheinlichkeit auf (gleichverteilt).
    Wenn ich jetzt einfach die Zahlen von 0-10 modulo 10 rechne, dann ist die Wahrscheinlichkeit, dass ich 0 erhalte doppelt hoch wie für alle anderen Zahlen: Schließlich bilden sowohl 0 als auch 10 auf die 0 im 0-9er-Bereich ab. Die 0 darf also zweimal würfeln 😉

    Nur so als Denkanstoss,
    Finnegan



  • Manche Leute schießen sich durch ihre Namenswahl aber auch wirklich selbst ins Bein.


  • Mod

    Finnegan schrieb:

    Ich habe Zufallszahlen von 0 bis 10, möchte aber welche von 0 bis 9. Jede Zahl zwischen 0 und 10 tritt mit gleich hoher Wahrscheinlichkeit auf (gleichverteilt).
    Wenn ich jetzt einfach die Zahlen von 0-10 modulo 10 rechne, dann ist die Wahrscheinlichkeit, dass ich 0 erhalte doppelt hoch wie für alle anderen Zahlen: Schließlich bilden sowohl 0 als auch 10 auf die 0 im 0-9er-Bereich ab. Die 0 darf also zweimal würfeln 😉

    Obwohl das zwar richtig ist, sollte man nicht vergessen, dass in vielen praktischen Fällen das Verhältnis nicht 2:1 ist, sondern eher in der Richtung 100001:100000. Das ist sogar gut genug für viele professionelle Anwendungen.



  • SeppJ schrieb:

    Finnegan schrieb:

    Ich habe Zufallszahlen von 0 bis 10, möchte aber welche von 0 bis 9. Jede Zahl zwischen 0 und 10 tritt mit gleich hoher Wahrscheinlichkeit auf (gleichverteilt).
    Wenn ich jetzt einfach die Zahlen von 0-10 modulo 10 rechne, dann ist die Wahrscheinlichkeit, dass ich 0 erhalte doppelt hoch wie für alle anderen Zahlen: Schließlich bilden sowohl 0 als auch 10 auf die 0 im 0-9er-Bereich ab. Die 0 darf also zweimal würfeln 😉

    Obwohl das zwar richtig ist, sollte man nicht vergessen, dass in vielen praktischen Fällen das Verhältnis nicht 2:1 ist, sondern eher in der Richtung 100001:100000. Das ist sogar gut genug für viele professionelle Anwendungen.

    Das ist richtig. Bis auf die Fälle wo es falsch ist :p

    Finnegan


Anmelden zum Antworten