Zufallszahl - C4244 Fehler
-
Hallo Community,
Ich bin ganz neu in Sachen C++ und knabbere gerade an einem Fehler der für euch wahrscheinlich recht banal erscheint, ich diesen jedoch nicht lösen kann.
Folgende Fehlermeldung erscheint: C4244 - Konvertierung von time_t in unsigned int, möglicher Datenverlust#include <iostream> #include <ctime> #include <random> using namespace std; int Zufall(); void Textausgabe(int Zufallszahl); int main() { int Zufall(); void Textausgabe(int Zufallszahl); return 0; } int Zufall() { default_random_engine Generator(time(NULL)); uniform_int_distribution<int> Ergebnis(0, 6); int Zufallszahl = Ergebnis(Generator); return Zufallszahl; } void Textausgabe (int Zufallszahl) { cout << "Du hast eine " << Zufallszahl << " gewürfelt! \n"; }Die Zeilen um
default_random_engine Generator(time(NULL));
uniform_int_distribution<int> Ergebnis(0, 6);
sind also die Übeltäter.Danke für eure Hilfe!
-
Da sind jede Menge Fehler drin, aber das was du beschreibst ist keiner. Das sollte eigentlich nur eine Warnung sein und besagt genau das, was da steht, dass nämlich ein time_t mehr Information enthält als ein unsigned int. Das ist in diesem Fall sicherlich nicht weiter tragisch, viel schlimmer sind die echten Fehler:
-Zeilen 13 und 15 sind keine Funktionsaufrufe, du wiederholst bloß noch einmal die Deklarationen.
-Ein lokaler Zufallsgenerator in einer Funktion, die offenbar mehrmals aufgerufen werden soll, geht vollkommen am Konzept eines Zufallszahlengenerators vorbei. Du rufst quasi nur die Uhrzeit ab, erzeugst aber keine Zufallszahlen. Der Zufallsgenerator ist doch bereits eine Funktion zum Zufallszahlenerzeugen, wieso also noch einmal eine Funktion drumherum machen?
-Keine Fehler, aber deine Bezeichner sind doof: Großschreibung (und Deutschschreibung) für Variablen und Funktionen ist unüblich. Inwiefern ist Ergebnis ein passender Bezeichner für eine Verteilung?
-
Warum möchtest du den Zufallsgenerator denn mit der Zeit initialisieren? Wenn du 2 Programme in derselben Sekunde startest, bekommst du 2x dieselben Werte.
Für echten Zufall ist std::random_device da. Damit initialisierst du dann deinen Pseudozufallsgenerator. Da solltest du std::mt19937 nehmen.
std::random_device rd; std::mt19937 generator(rd());Ansonsten schau dir mal https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful an. Ein Punkt gleich am Anfang ist, dass man nicht time nutzen soll. Ab Minute 10 oder so geht es los, wie mans richtig macht. Vorher ist, wie man es nicht machen soll.