Zufall



  • Warum geht das hier nicht?

    short rnd(short a, short b)
    {
        return (a + rand()) % (b – a + 1);
    }
    

    Es kommt:
    -------------- Build: Debug in Bitmap ---------------
    Compiling: zufall.cpp
    zufall.cpp: In function short int rnd(short int, short int)': zufall.cpp:5: error: stray '\\150' in program zufall.cpp:5: error: expected)' before "a"
    Process terminated with status 1 (0 minutes, 0 seconds)
    2 errors, 0 warnings

    MfG
    Stromberg

    EDIT: irgendwie wird der Code hier bissel verdreht. Hier is er nochma:
    http://pastebin.ca/833111



  • was soll das hier – denn bitte sein?



  • Sein Code wurde "verdreht". Ich versuchs mal:

    short rnd(short a, short b)
    {
        return (a + rand()) % (b - a + 1);
    }
    

    Übrigens du hast da einen "Strich" in deinem Programm. Das ist kein Minus-Zeichen. Sowas hab ich ja noch nie gesehen 😃 Vielleicht copy&paste-Fehler?

    Gruß
    Don06



  • short rand(const short min, const short max)
    {
        return (min + std::rand()) % (max - min + 1);
    }
    

    ... hmm so geht das schon 😉 Nur ist so das Zufallsprinzip gestört!

    short rand(const short min, const short max)
    {
        return min + static_cast<short>(static_cast<double>((max - min + 1) * std::rand()) / (RAND_MAX + 1.0));
    }
    

    wäre besser!



  • Don06 schrieb:

    Übrigens du hast da einen "Strich" in deinem Programm. Das ist kein Minus-Zeichen. Sowas hab ich ja noch nie gesehen 😃 Vielleicht copy&paste-Fehler?

    Anti Copy & Paste Code 😃



  • (D)Evil schrieb:

    Nur ist so das Zufallsprinzip gestört!

    short rand(const short min, const short max)
    {
        return min + static_cast<short>(static_cast<double>((max - min + 1) * std::rand()) / (RAND_MAX + 1.0));
    }
    

    wäre besser!

    mich würde interessieren, wie du auf diese zweite methode kommst und warum diese zufälliger sein soll als die erste.

    EDIT:
    ich hab mir das überlegt und auch ausprobiert. bei mir kommt immer nur der minimale wert als rückgabe. das ist auch logisch. bei sehr kleinen schranken bekommst du bei deinem short-static_cast 0 heraus, da du mit static_cast<double>((max - min + 1) * std::rand()) oft einen wert bekommst, der unterhalb von (RAND_MAX + 1.0) liegt. dadurch ergibt die division immer 0. man muss das glück haben, dass der inhalt des double-cast zu einem wert zw. RAND_MAX und INT_MAX kommt. sollte er über INT_MAX gehen, so wird der inhalt des double-cast negativ, aber meistens wiederum betragsmäßig zu klein, als dass die division durch (RAND_MAX + 1.0) etwas anderes als 0 zurückgibt. sind halt meine beobachtungen...



  • namenlos schrieb:

    mich würde interessieren, wie du auf diese zweite methode kommst und warum diese zufälliger sein soll als die erste.

    Stichwort Verteilungsgerechtigkeit, wird sehr schön im gleichnamigen Kapitel dieses Artikels beleuchtet.


Anmelden zum Antworten