Ich hab das Problem, dass in meinem Programm so einiges Flasch läuft. Ich habe vor, zu errechnen, wie oft man einen 2x2x2 Rubik’s Cube absolut zufällig drehen müsste, bis er gelöst ist, aber das nur als Randbemerkung.
Ich berechne für jeden möglichen ‚Zug‘ (Möglichkeiten: Left/Right/…) eine Zufallszahl. Nur leider entstehen, wenn ich nicht nach jedem Generieren ein ‚enter‘ einfordere, bei 500 generierten zahlen nur zwei verschiedene: Er macht diese ja bekanntlich von der Zeit abhängig, aber anscheinend ist er zu schnell im berechnen. Wisst ihr, wie ich mein Programm vernümpftig zum laufen bringen kann?
Das Problem sind im Moment wirklich nur die Zufallszahlen, da diese sich nicht schnell genug ändern sondern den Wert beibehalten.
Entschuldige, jeder muss es erstmal lernen… Also, die Funktion lautet:
int Wuerfel::random(int grenze)
{
srand((unsigned)time(NULL));
return (1+(rand()%grenze));
}
Dies gibt auch die entsprechenden Zahlen aus, jedoch leider nicht, wenn ich sie ‚direkt‘ hintereinander berechnen lasse, dann ist er anscheinend zu schnell. Zugreifen tue ich auf die Funktion dann mittels:
zahl = wuerfel.random(12);
Liebe Grüße und Sorry wegen den Startschwierigkeiten =D
Shisu
int Wuerfel::random(int grenze)
{
srand((unsigned)time(NULL));
return (1+(rand()%grenze));
}
srand setzt den Initialwert fuer die Zufallszahlen.
Wenn du Wuerfel::random ganz schnell hintereinander aufrufst und die aktuelle Zeit waere 42, dann haettest du die Sequenz
srand(42);
... rand()
srand(42);
... rand();
und da muss der Pseudozufallszahlengenerator immer den gleichen Wert liefern. Besser ist es, du initialisierst einmalig srand() (z.B. in main()) und rufst danach in deiner random() Methode nur noch rand() auf.
Ja, jetzt spuckt der PC schöne Zufallszahlen aus, danke!!
Aber nochmal zum verständniss: Ich sollte dabei also immer nur einmal die Funktion initialisieren? Dami ichs demnächst nicht falsch mache
Denn es wäre eine glatte Lüge, wenn ich behaupten würde, ich wüsste, wie dieser Zufallsgenerator Funktioniert. Im Allgemeinen weiß ichs, im Deatil habe ichs nur aus ner Website kopiert.
Es ist nicht nötig, „srand“ bei jedem Durchlauf auszuführen, da sie nur zur Anfangsinitialisierung dienen sollte.
Könnte folgendermaßen ausschauen: ( Am besten aber in den Konstruktor verfrachten )
int Wuerfel::random(int grenze)
{
static bool bRandInit = false;
Ja, jetzt spuckt der PC schöne Zufallszahlen aus, danke!!
Aber nochmal zum verständniss: Ich sollte dabei also immer nur
einmal die Funktion initialisieren? Dami ichs demnächst nicht
falsch mache
Applikationen, die Pseudozufallszahlen benoetigen, sollten srand einmalig aufrufen (so wie dein Programm).
Applikationen, die dieselbe Sequenz von Pseudozufallszahlen mehrfach benoetigen, koennten srand auch mehrmals aufrufen.
Denn es wäre eine glatte Lüge, wenn ich behaupten würde, ich
wüsste, wie dieser Zufallsgenerator Funktioniert. Im
Allgemeinen weiß ichs, im Deatil habe ichs nur aus ner Website
kopiert.