Random Problem...
lima-city → Forum → Programmiersprachen → C/C++ und D
antwort
aufruf
beispiel
cast
compiler
dingen
division
faktor
funktion
gedacht
implementierung
main
null
offensichtlichen fehler
reihenfolge
schnelle antwort
thematik
thw
tic
treffen
-
ho leute ;)
ich habe vor einiger zeit angefangen c++ zu lernen, bin also noch weit von guten progs und codes entfernt...
wie dem auch sei wollte ich mir ein tic tac toe (textbasiert) schreiben, und dass das ganze nicht so langweilig wird, wollte ich die CPU immer verschiedene entscheidungen treffen lassen.
ich habe mir das so gedacht, dass einer variablen ein wert zwischen 1 und 3 zugewiesen wird, und je nach dem, welche zahl es dann ist, macht der computer einen anderen zug...
das problem dabei...ich hab shcon eineige sachen ausprobiert, und es ist mir noch immer nciht gelungen einen einfachen befehl zu finden, der eifach nur einen wert von 1, 2, oder 3 in die var tttrand (tic tac toe random) packt.
ich danke für jeden, der mir helfen kann, und code lösungsvorschläge für mich hat. (wie gesagt, dass tic tac toe ist nicht das problem, sondern der random faktor *g*)
lg
Sincer -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Versuchs mal damit:
int tttrand; tttrand = (rand()%3)+1;
Zur Erklärung:
rand() gibt irgendeine Zufallszahl zurück. rand()%3 ergibt den Rest der Division dieser Zufallszahl durch 3, also 0, 1 oder 2. Deshalb musst du noch eins dazu rechnen.
Kann sein, dass du dafür die cstdlib einbinden musst (#include <cstdlib>) - probiers aus. -
thx für die schnelle antwort...aber irgendwie funzt das nicht richtig :/
int main() { int tttrand; tttrand = (rand()%3)+1; cout<<"Die zahl lautet: "<<tttrand<<endl; tttrand = 0; cin.get(); return 0; }
ich bekomme immer die zahl 3...ich habe auch schon diese zeile eingebaut - tttrand = 0; - die mir die var wieder auf 0 setzt, um bei dem nächsten mal ausführen eine andere antwort zu bekommen, baber es kam weiterhin nur 3...
hast du oder jem. noch einen vorschlag, oder eine verfeinerung, damit das geht?
danke auf jeden fall
Sincer
-
Dann versuchs mal mit:
srand((unsigned)time(NULL)); int tttrand; tttrand = (rand()%3)+1;
Möglicherweise musst du zusätzlich noch ctime einbinden (#include <ctime>). -
nochmal thx für die schnelle antwort :)
und das ist auch schon einen funken besser...aber noch nciht ganz perfekt...
jetzt schaut das so aus...
die zahlen...
1
1
1
1
1
1...
2
2
2
2
2...
3
3
3
3
3
3
3...
1
1
1
...
usw usw... immer wieder 1er, dannach 2er und dann 3er, und dann fängt es wieder bei 1er an und weiter zu 2er usw usw...
hast du noch einen vorschlag?
Sincer war noch nie so nah an seinem random ding drann wie jetzt *g*
immerhin bleiben die zahlen zwischen 1 und 3 und sie wächseln, aber...in welcher reihenfolge, und wie oft...
nochmal danke für die schnele antwort ;) und danke für jeden weiteren lösungsvorschlag :)
der aktuelle code:
int main() { srand((unsigned)time(NULL)); int tttrand; tttrand = (rand()%3)+1; cout<<"Die zahl lautet: "<<tttrand<<endl; tttrand = 0; cin.get(); return 0; }
und natürlich sind alle nötigen sachen wie du es gesagt hast eingebunden...
lg
Sincer -
Generell ist die Verwendung des Modulo-Operators für Zufallszahlen nicht so empfehlenswert, da die Zahlen dann nicht gleichverteilt sind.
Die Manpage zu rand (3) empfiehlt für eine Zufallszahl zwischen 1 und 10:
j=1+(int) (10.0*rand()/(RAND_MAX+1.0));
was sich mittlerweile auch so eingebürgert hat und für alltägliche, unkritische Anwendungsfälle ausreichen sollte. Versuch's mal mit dieser Formel :)
Manche Implementierungen von time() verhalten sich komisch wenn sie einen Nullpointer bekommen. Evtl. hier testweise mal einen Pointer auf einen beschreibbaren Speicherbereich der Größe sizeof(time_t) übergeben und gucken was passiert...
Nur ein paar Gedanken, die mir grad kamen...
HTH,
thw -
j=1+(int) (10.0*rand()/(RAND_MAX+1.0));
k, und wenn ich das verwende, kann ich das 1:1 einsetzen, oder mus ich da was für int einsetzen, oder irgendwelche sachen #einfügen <?> ?
danke auf jeden fall...
Sincer -
Du musst für 10.0 die höchste gewünschte Zahl und für 1.0 die niedrigste gewünschte Zahl einsetzen. Den Cast (int) und RAND_MAX lässt du bitte wie er ist :)
Es kann sein dass du noch limits.h einbinden musst (#include <limits.h>), probier das mal aus wenn der Compiler Fehler der Art "RAND_MAX undefined" o.ä. bringt.
MfG,
thw -
int main()
{
int j;
j=1+(int) (10.0*rand()/(RAND_MAX+1.0));
cout<<j<<endl;
cin.get();
return 0;
}
das ist der aktuelle code...
habe alles so gelassen, wie du es gesagt hast, auch limits.h eingebunden (obwohl es auch vorher ausgeführt wurde...)
aber den einzigen wert, den er ausgibt ist 1, und wenn ich die erste zahl (1+...) änder zu 5+..., dann gibt er halt immer nur 5 aus...
ich benütze den Dev-C++ 4 Compiler, aber hatte noch nie probleme damit...
siehst du vil. noch einen offensichtlichen fehler in dem code?
thx ;)
Sincer -
Du hast vergessen den Zufallszahlengenerator zu initialisieren. Dafür gibt's eine Funktion srand().
Generell hilft das Studium von Manpages ungemein bei solchen Funktionen. Ich empfehle zu der Thematik auch http://www.maconlinux.net/linux-man-pages/de/srand.3.html (Manpage zu rand und srand). Initialisieren kannst du auf diese oder ähnliche Weise:
srand(time(NULL));
oder
time_t s=malloc(sizeof(time_t));
time(s);
srand(s);
free(s);
jeweils vor dem ersten Aufruf von rand() und nur einmal im Programm.
Die beiden Codes sollten in ihrer Funktion äquivalent sein, es gibt wohl time()-Implementierungen die keinen NULL-Pointer haben wollen, dann einfach das zweite Beispiel mal probieren (hab ich weiter oben schonmal geschrieben gehabt).
Manpage zu time(): http://www.maconlinux.net/linux-man-pages/de/time.2.html
HTH,
thw -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage