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 jedemrand
.
-
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 intime.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"?
-
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 einlong 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 alsdouble