Zufall: vc++ vs. gcc



  • Hallo,

    habe eine Zufallsfunktion, die u.a. auch mit Zahlen <1 umgehen soll bzw. float Zufallswerte generieren soll. In Tests mit Visual C++ scheint es zu funktionieren.
    Unter Linux mit dem gcc versuchte ich es nun auch mit der Funktion; aber leider erhängt sich die Anwendung irgendwo, wenn ich nicht rnd(5), sondern z.b. rnd(5.1) aufrufe, also eine float, statt Ganzzahl teste.
    Hier die Funktion:

    float rnd(float max)

    {

    int pot=0;

    float z=0;

    if(max==0)

    return 0;

    while((int)max!=(float)max)

    {

    max*=10.0;

    pot++;

    }

    if(max==1.0)

    {

    max*=100;

    pot+=2;

    }

    while(RAND_MAX<max)

    {

    max=(int)(max/10);

    pot--;

    }

    z=rand()%(int)max+1;

    for(;pot>0;pot--)

    {

    z/=10.0;

    }

    return z;

    }

    Wenn ich bei der Funktion einen sem. Fehler eingebaut habe, so hoffe ich, dass Ihr ihn findet; aber dennoch würde mich das dann wundern, dass es im VC++ läuft.
    Was meint Ihr?

    Danke für Eure Hilfe!
    Schönen Tag noch



  • Das Problem ist vermutlich, daß der Rechner Gleitkommazahlen nicht wirklich exakt darstellen kann und deshalb irgendwo runden muß. Und dadurch könnte es passieren, daß die erste Schleife nicht abbricht (weil in Wirklichkeit nicht 5.1 übergeben wird, sondern 5.10000000012).

    Aber nur für mich - was genau soll diese ganze Umrechnerei bringen? Ich würde es wohl eher so lösen:

    float rnd(float max)
    {
      return ((float)rand()/RAND_MAX)*max;
    }
    


  • hallo,

    danke für die schnelle antwort.
    hattest recht!
    wie gesagt, das war nur ein kleiner test... jetzt kenne ich einen unterschied mehr zwisch vc und gcc 🙂

    schönen tag noch



  • Naja, er will halt auch Zahlen mit Nachkommastellen rausbekommen. Geht da aber einen vollkommen unperformanten und unsicheren Weg.

    float rang_rand(const float min, const float max)
    { return min + (static_cast<float>(std::rand()) / RAND_MAX) * max; }
    

    hmm ... naja das wahre ist die Wahrscheinlichkeitsverteilung jetzt nicht ^^ Was er wollte war eher, jetzt anzugeben, wie viele Potenzen drin sein sollen, und dann dementsprechend das zu machen:

    float rang_rand(const float min, const float max, const std::size_t pow)
    { return min + ((static_cast<float>(std::rand()) / RAND_MAX) * max) / (pow * 10.f); }
    

    oder so ...


Anmelden zum Antworten