random mal wieder



  • ich weiß daß das schon recht oft hier gefragt wurde aber daraus werde ich nciht schlau.
    also ich brauche zufallszahlen die immer in fünfer schritten gehn und nicht kleiner als 10 und nicht größer als 410 sind.
    ok danke und wenn noch fragen sind fragt nur
    THX Hurrican

    ------------------
    !!!Meine HP!!!



  • Ich versteh noch nicht, wo Dein Problem damit ist.
    Also Zufallszahlen der Funktion rand() gehen von 0 bis RAND_MAX. Dieser Bereich soll auf [10,410] eingeschränkt werden. Von diesem Bereich subrahiere ich 10, um den gleichen Anfangswert für beide Bereiche zu bekommen !

    =>
    [0,RAND_MAX] -> [0,400]
    Ersteren Bereich schränken wir ein auf [0,1], indem wir durch den Maximalwert dividieren. Danach muß mit dem Maximalwert des 2. Bereiches Multipliziert werden.

    Definiere v als Random-Value aus erster Menge, v' als Ergebnis aus der 2. Menge

    => v' = v/RAND_MAX*400

    Für die Schrittweite fünf muß die 400 in 5er-Schritte zerlegt werden => 400 = 80*5

    => v' = (v/RAND_MAX*80)*5

    Um jetzt allerdings die Zwischenwerte loszuwerden, die halt zwischen 0 und 5, 5 und 10, 10 und 15 u.s.w. liegen, rechnen wir bloß mit dem Integerteil von (v/RAND_MAX*80).

    => v' =(int)((double)v*80/RAND_MAX)*5

    Und jetzt müssen wir wieder die 10 addieren, die wir vorhin subtrahiert haben.

    Das Ergebnis sieht dann folgendermaßen aus:

    v' =(int)((double)v*80/RAND_MAX)*5 + 10;

    Genügt das als Antwort auf Deine Frage ??

    Gruß
    René



  • ok jetzt is noch mein problem das der bereich nicht von 0-400 geht
    im konsturtor
    {
    rand(400);
    }

    void CSnakeDlg::random ( )
    //Zufallszahlen werden erzeugt
    {
    int v1=0;
    int v=rand();
    v1=(int)((double)v*80/400)*5 + 10;
    }

    [Diese Nachricht wurde von Hurrican am 05-09-2000 editiert.]



  • auf daß der Sturm über Dich komme... wozu glaubst Du addiert er am Ende ein "+10"??? Damit man vom Bereich 0..400 auf den Bereich 10..410 kommt!

    ------------------
    Viele Grüße

    Marc++us

    Besucht die C/C++-Ecke
    http://www.c-plusplus.net



  • Also Hurrican, wenn Du nicht einmal richtig abschreiben kannst, tut es mir schon leid !!

    1. Wozu im Konstruktor ein rand(400), der Befehl rand() hat keine Parameter !!!

    2. Schau Dir mal Deine Formel für die Berechnung an und dann meine, falls Du nach genauerem Betrachten nicht den Unterschied siehst, solltest Du Dir mal eine Brille zulegen !!



  • ok erstmal sorry rené ich meinte srand(400); im konstuktor (und ich trag ne brille)

    marcus ich bekomme werte von 12000 und höher aber schon in fünfer schritten

    ------------------
    !!!Meine HP!!!

    [Diese Nachricht wurde von Hurrican am 05-09-2000 editiert.]



  • Vergleich einfach die Formel von Rene mit deiner Formel!

    ReneG: v' =(int)((double)v*80/RAND_MAX)*5 + 10;

    Hurrican: v1=(int)((double)v*80/400)*5 + 10;

    Nun, fällt dir was auf?
    (Ich meine jetzt nicht, dass du v1 anstatt v' verwendet hast)



  • RAND_MAX is doch nur ein variable die ich mit einem wert füllen muß oder???
    z.B. 400 is das denn nicht das gleiche?

    ------------------
    !!!Meine HP!!!



  • OK OK OK jetzt hab ichs war mein fehler *schäm*

    ------------------
    !!!Meine HP!!!



  • ok noch ne frage http://www.c-plusplus.net/ubb/ubb/biggrin.gif
    da ich das zweimal nacheinander machen muß. wie bekomme ich daraus zwei so unterschiedliche zahlen wie nur möglich

    ------------------
    !!!Meine HP!!!

    [Diese Nachricht wurde von Hurrican am 05-09-2000 editiert.]



  • naja, einfach zweimal hintereinander aufrufen... das was Du forderst wird durch den Begriff "Zufallszahl" schon weitgehend erfüllt.

    ------------------
    Viele Grüße

    Marc++us

    Besucht die C/C++-Ecke
    http://www.c-plusplus.net



  • nein geht nciht dann bekomme ich IMMER die selben zahlen

    ------------------
    !!!Meine HP!!!



  • Vermutlich hast du srand mit einem festen Werd aufgerufen. Bevor du rand das erste mal aufrufst, muss die Funktion srand mit einem zufälligen Wert (z.B. der Systemzeit) aufgerufen werden. Näheres findest du bestimmt in der Doku zu rand /srand.