kostenloser Webspace werbefrei: lima-city


Random Problem...

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    sincer

    Kostenloser Webspace von sincer

    sincer hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. sandrock-jonas

    Kostenloser Webspace von sandrock-jonas

    sandrock-jonas hat kostenlosen Webspace.

    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&#252;r die cstdlib einbinden musst (#include <cstdlib>) - probiers aus.
  4. Autor dieses Themas

    sincer

    Kostenloser Webspace von sincer

    sincer hat kostenlosen Webspace.

    thx f&uuml;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&auml;chsten mal ausf&uuml;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
  5. sandrock-jonas

    Kostenloser Webspace von sandrock-jonas

    sandrock-jonas hat kostenlosen Webspace.

    Dann versuchs mal mit:

    srand((unsigned)time(NULL));
    int tttrand;
    tttrand = (rand()%3)+1;


    M&#246;glicherweise musst du zus&#228;tzlich noch ctime einbinden (#include <ctime>).
  6. Autor dieses Themas

    sincer

    Kostenloser Webspace von sincer

    sincer hat kostenlosen Webspace.

    nochmal thx f&uuml;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&auml;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&auml;chseln, aber...in welcher reihenfolge, und wie oft...

    nochmal danke f&uuml;r die schnele antwort ;) und danke f&uuml;r jeden weiteren l&ouml;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&uuml;rlich sind alle n&ouml;tigen sachen wie du es gesagt hast eingebunden...

    lg
    Sincer
  7. Generell ist die Verwendung des Modulo-Operators f&#252;r Zufallszahlen nicht so empfehlenswert, da die Zahlen dann nicht gleichverteilt sind.

    Die Manpage zu rand (3) empfiehlt f&#252;r eine Zufallszahl zwischen 1 und 10:

    j=1+(int) (10.0*rand()/(RAND_MAX+1.0));

    was sich mittlerweile auch so eingeb&#252;rgert hat und f&#252;r allt&#228;gliche, unkritische Anwendungsf&#228;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&#246;&#223;e sizeof(time_t) &#252;bergeben und gucken was passiert...

    Nur ein paar Gedanken, die mir grad kamen...

    HTH,
    thw
  8. Autor dieses Themas

    sincer

    Kostenloser Webspace von sincer

    sincer hat kostenlosen Webspace.

    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&uuml;r int einsetzen, oder irgendwelche sachen #einf&uuml;gen <?> ?
    danke auf jeden fall...
    Sincer
  9. Du musst f&#252;r 10.0 die h&#246;chste gew&#252;nschte Zahl und f&#252;r 1.0 die niedrigste gew&#252;nschte Zahl einsetzen. Den Cast (int) und RAND_MAX l&#228;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.&#228;. bringt.

    MfG,
    thw
  10. Autor dieses Themas

    sincer

    Kostenloser Webspace von sincer

    sincer hat kostenlosen Webspace.

    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&uuml;hrt wurde...)
    aber den einzigen wert, den er ausgibt ist 1, und wenn ich die erste zahl (1+...) &auml;nder zu 5+..., dann gibt er halt immer nur 5 aus...

    ich ben&uuml;tze den Dev-C++ 4 Compiler, aber hatte noch nie probleme damit...
    siehst du vil. noch einen offensichtlichen fehler in dem code?

    thx ;)
    Sincer
  11. Du hast vergessen den Zufallszahlengenerator zu initialisieren. Daf&#252;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 &#228;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 &#228;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
  12. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!