[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.
Nö
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)); }