[gelöst] Code verhält sich unterschiedlich unter PC und Mac



  • Hallo, ich hab folgendes Problem. Die unten aufgeführte Funktion soll mir eine zufällige Zahl zwischen 0 und 51 liefern. Das merkwürdige ist, wenn ich den Code unter Windows compiliere muss ich der Funktion eine 51 übergeben und unter einem Mac-Rechner eine 52. Hab ich einen Fehler im Code oder liegt das einfach an den unterschiedlichen Systemen?

    //
    // returns a random number between 0 and i
    //
    unsigned int ClassXY::RandomNo(unsigned int i) {
      return (unsigned int)((double)rand()/RAND_MAX*i);
    }
    


  • Warum verwendest du nicht einfach modulo? Es kann ja durchaus sein, dass die Systeme unterschiedlich runden.

    rand() % i //Zahl zwischen 0 und i - 1
    


  • bogus2k schrieb:

    Hallo, ich hab folgendes Problem. Die unten aufgeführte Funktion soll mir eine zufällige Zahl zwischen 0 und 51 liefern. Das merkwürdige ist, wenn ich den Code unter Windows compiliere muss ich der Funktion eine 51 übergeben und unter einem Mac-Rechner eine 52. Hab ich einen Fehler im Code oder liegt das einfach an den unterschiedlichen Systemen?

    //
    // returns a random number between 0 and i
    //
    unsigned int ClassXY::RandomNo(unsigned int i) {
      return (unsigned int)((double)rand()/RAND_MAX*i);
    }
    

    Das ist ein Genauigkeitproblem von Double. Vermutlich ist irgendwas an der Floatingpointbhenadlung unterschiedlich auf den beiden Plattformen, oder die Einstellungen im Compiler sind unterschiedlich.
    Wieso nicht mit Modulo?



  • Super, vielen Dank! Ich bin noch blutiger Anfänger, auf so einfache Lösungen kommt man da manchmal nicht... 😉



  • Tachyon schrieb:

    Das ist ein Genauigkeitproblem von Double.

    Wieso nicht mit Modulo?

    Weil Module Kacke ist wenn rand() ein einfacher LCG ist?

    bogus2k schrieb:

    //
    // returns a random number between 0 and i
    //
    unsigned int ClassXY::RandomNo(unsigned int i) {
      return (unsigned int)((double)rand()/RAND_MAX*i);
    }
    

    Das Problem ist nicht der Unterschied zwischen Windows und Mac oder die (durchaus vorhandene) Ungenauigkeit von double, sondern dass du falsch rechnest.

    //
    // returns a random number between 0 and i
    //
    unsigned int ClassXY::RandomNo(unsigned int i) {
      return (unsigned int)((double)rand()/(RAND_MAX + 1)*(i + 1));
    }
    

Anmelden zum Antworten