Zufallszahl alternativ berechnen?

Guten Tag,

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.

Hoffe mir kann jemand Helfen!

LG
Shisu

Hallo Shisu,

Der Fehler ist in Zeile 69!

Aber im Ernst, wenn wir nicht wissen wie du den Zufallsgenerator ansteuerst, wissen wir auch nicht was du falsch machst.

Also poste hier mal zumindest den Code, welche die Zufallszahlen erzeugt.

MfG Peter(TOO)

Huhu!

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

Howdy,

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.

Gruss
norsemanna

Huhu!

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 :wink:

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.

Liebe Grüße und riesen Dank!
Shisu

Servus,

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;

if(!bRandInit)
{
srand((unsigned)time(NULL));
bRandInit = true;
}

return (1+(rand()%grenze));
}

Huhu!

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 :wink:

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.

Lies
http://de.wikipedia.org/wiki/Zufallszahlengenerator

Gruss
norsemanna

Danke!!

*Close*