SRAND Warnings



  • Hallo zusammen,
    zu folgendem Code:

    float Generate_Random_Num_UnitPart(float End_Unit) {
    
         struct timeval time;
    
         gettimeofday(&time,NULL);
         srand( time.tv_sec * (1000000.0) + time.tv_usec);
         int Int_End, x;
    
         Int_End = (int) End_Unit;
         x=rand() % Int_End ;
         return (float) x;
    }
    

    bekomme ich diese Warnung:

    warning: conversion to ‘double’ from ‘__time_t’ may alter its value [-Wconversion]
          srand( time.tv_sec * (1000000.0) + time.tv_usec);
    

    Kann mir einer erklären warum dies so ist und wie ich die Warnung beseitigen kann?!? 😕

    Vielen Dank im Voraus.
    Lion1981



  • Das Ergebnis von time.tv_sec * (1000000.0) + time.tv_usec ist (wegen der .0) ein double.
    srand erwartet ein unsigned int als Parameter. Bei der Konvertierung können Informationen verloren gehen, da der Wertebereich nicht übereinstimmt.

    A_b_e_r, dieser ganze Kram ist gar nicht nötig, da man srand nur einmal am Anfang vom ganzen Programm aufruft. Danach ist das nicht mehr nötig.

    Und da reicht ein srand (time(NULL)); völlig aus, es sei denn du startest das Programm mehrmals pro Sekunde.

    Und glaube auch nicht, dass die Genauigkeit von time.tv_usec wirklich 1 µs ist.

    Nochmal: srand nur einmal im ganzen Programm und nicht vor jedem rand .



  • Vielen Dank DirkB für Deine schnelle Antwort und Deine Hinweise. Leider weiß ich nicht, wie ich Deine Hinweise umsetzen kann.

    Könntest Du mir vielleicht bei meinem kleinen Beispiel helfen?!?

    Vielen Dank und sorry...



  • Kein srand in der Funktion.
    Das heißt die Zeile 6 ist überflüssig.
    Dann brauchst du die Zeilen 3 und 5 auch nicht mehr.

    Den Code

    srand (time(NULL));
    

    schreibst du irgendwo am Anfang der main-Funktion. So als eine der ersten Aktionen.
    time ist in time.h deklariert. srand hattest du ja schon.

    Du hast als Rückgabewert ein float , benutz aber nur die Vorkommastelle.
    Soll das so sein?



  • Es wird nicht vor der Konvertierung von double nach unsigned int gewarnt, sonder vor __time_t --> double. Vermutlich ist __time_t ein Ganzzahltyp, der mehr Stellen hat als der Typ double darstellen kann.



  • Kleinlich schrieb:

    Es wird nicht vor der Konvertierung von double nach unsigned int gewarnt, sonder vor __time_t --> double. Vermutlich ist __time_t ein Ganzzahltyp, der mehr Stellen hat als der Typ double darstellen kann.

    Ja, denke ich auch. time.tv_sec is ein long (Ganzzahl).Aber ich denke nicht, dass es an „mehr Stellen“ liegt, sondern weil die Stellen nach dem Komma abgeschnitten werden.-> datenverlust, Warnung weil das ganze implizit geschieht.
    Also 1000000.0 zu -> 1000000, dann dürfte der Verlust von Daten aus der Welt sein.
    Prämisse: time_t kenne ich nur als Platzhalter für einen Datentyp, der irgendwas mit Zeit zu tun hat.

    @DirkB
    Warum brauch man im gesamten Programm nur einen neuen Seed? Wird die Funktion oft aufgerufen hat man doch von rand() wieder andauernd die gleichen "Zufallszahlfolge"?


  • Mod

    einWunderSchönerName2 schrieb:

    Kleinlich schrieb:

    Es wird nicht vor der Konvertierung von double nach unsigned int gewarnt, sonder vor __time_t --> double. Vermutlich ist __time_t ein Ganzzahltyp, der mehr Stellen hat als der Typ double darstellen kann.

    Ja, denke ich auch. time.tv_sec is ein long (Ganzzahl).Aber ich denke nicht, dass es an „mehr Stellen“ liegt, sondern weil die Stellen nach dem Komma abgeschnitten werden.-> datenverlust, Warnung weil das ganze implizit geschieht.
    Also 1000000.0 zu -> 1000000, dann dürfte der Verlust von Daten aus der Welt sein.

    Nein. Lies noch mal aufmerksam, was Kleinlich geschrieben hat und was in der Fehlermeldung steht.

    @DirkB
    Warum brauch man im gesamten Programm nur einen neuen Seed? Wird die Funktion oft aufgerufen hat man doch von rand() wieder andauernd die gleichen "Zufallszahlfolge"?

    Aber eine Folge von Zufallszahlen ausgehend von diesem Anfangswert. Das ist doch genau, was man möchte.



  • SeppJ schrieb:

    Nein. Lies noch mal aufmerksam, was Kleinlich geschrieben hat und was in der Fehlermeldung steht.

    Arg. Ja lesekompetenzen sind ein Vorteil. Ich hab nur gelesen, dass time_t mehr stellen haben soll als double. Der Rest ging unter, sry.
    time_t ist auch nicht immer ein long. Sondern anscheinend Plattformabhängig. Außerdem ist vestimmt __time_t sogar noch was anderes als time_t. Auf so vielen Ebenen Murks.

    SeppJ schrieb:

    Aber eine Folge von Zufallszahlen ausgehend von diesem Anfangswert. Das ist doch genau, was man möchte.

    Habs ausprobiert. Stimmt. Hab das jetzt ewig "falsch" gemacht. Literatur missgedeutet: wiederkehrende Zahlenfolge != sich wiederholende Zahlenfolge.

    Ohman.



  • einWunderSchönerName2 schrieb:

    Außerdem ist vestimmt __time_t sogar noch was anderes als time_t.

    __time_t ist ein __SLONGWORD_TYPE ist ein long int .
    Es wird nicht für 64 oder 32-Bit unterschieden.
    ^(Soweit ich das bis jetzt gefunden habe)^

    Da long bei 64-Bit Linux ja auch 64-Bit groß ist, hat es dann mehr signifikante Stellen als double


Anmelden zum Antworten