Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Zufallszahlen und deren "Parameter"

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
22.06.2006, 00:12 Uhr
Fraenky



Hallo Leute!
ich werd ma wieder das ledige Thema der Zufallszhalen anschneiden! ;-) Ich habe schon die Suchfunktion benutzt, bin aber nicht auf das speziele meines Problems gestoßen:

Also ich erzeuge ANZAHL Zufallszahlen. Nun möchte ich gerne die Bedingungen quasi rekonstruieren, die zu genau diesen Zufallszahlen geführt haben. Es ja ja bekanntlich so, wenn man bei gleicher Zeit und mehreren Zufalls-Funktions aufrufen auch gleiche (Zufalls)zahlen bekommt, hier ist die Bedingung also die ZEIT. Das heißt, so denke ich mir, wenn ich jetzt Zufallszahlen bei einem bestimmten Zeitpunkt generiere, kann ich genau diese Zufallszahlen wieder rekonstruieren, indem ich den Zeitpunkt der Erzeugung speichere und ihn dann als Parameter wieder einer Zufallsfunktion übergebe, oder?!

Ist diese Theoretische Überlegung richtig? Wenn ja, wie speichere ich den Zeitpunkt bzw die Parameter dieses "Standardscodes" (von Virtual) für Zufallszahlen und übergebe diese einer weiteren Zufallsfunktion??


C++:
/*
* Berechne Zufallszahl im Bereich [von, bis]
*/

int zufall(int von, int bis)
{
    static int srand_bereits_aufgerufen = 0;

    if (!srand_bereits_aufgerufen)
    {
        srand(time(NULL));
        srand_bereits_aufgerufen = 1;
    }
    return von + rand()%(bis-von+1);
}



Wie gesagt, ich erzeuge ANZAHL Zufallszahlen (hängt von der Eingabe ab) und möchte diese später wieder erzeugen können, deswegen meine Vorüberlegungen..ist dies denn machbar? Wenn ja wie?

Danke!!!

Mfg
Fraenky
--
Welcome to the real World.

www.fraenkysweb.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.06.2006, 07:52 Uhr
ao

(Operator)


Du musst dir den Wert merken, mit dem srand gefüttert wurde. Und zum Rekonstruieren denselben Wert verwenden.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.06.2006, 12:14 Uhr
Fraenky



Hi!
kannst du mir evtl ein Code beispiel geben?

Theoretisch es müsste also so gehen, da srand() mit time(NULL) gefüttert wurde, oder?


C++:
/*
* Berechne Zufallszahl im Bereich [von, bis]
*/

int zufall(int von, int bis)
{
    static int srand_bereits_aufgerufen = 0;
    
    int iParameter=0;    

    if (!srand_bereits_aufgerufen)
    {
        srand(time(NULL));

        iParameter=time(NULL);

        srand_bereits_aufgerufen = 1;
    }
    return von + rand()%(bis-von+1);

    return iParameter;
}



Von welchen Typs müsste denn die Variable sein, die den Wert von srand speichert?

MfG
Fraenky
--
Welcome to the real World.

www.fraenkysweb.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.06.2006, 15:16 Uhr
ao

(Operator)


Ungefähr so (ohne Test hingekritzelt)

C++:
int zufall (int von, int bis, int von_vorne)
{
    static int erstes_mal = 1;
    static unsigned srand_init;

    /* Beim ersten Aufruf den Startwert für srand ziehen und merken,
       außerdem mittels von_vorne = 1 erzwingen, dass srand () aufgerufen wird */

    if (erstes_mal)
    {
        erstes_mal = 0;

        srand_init = time(NULL);

        von_vorne = 1;
    }

    /* Wenn die von_vorne-Flagge gesetzt ist, wird der anfangs gezogene Startwert
       neu gesetzt. Dadurch wiederholt sich ab jetzt die Folge der von rand ()
       gelieferten Zahlen. */

    if (von_vorne)
    {
        srand (srand_init);
    }

    /* ... und jetzt würfeln */
    return von + rand () % (bis - von + 1);
}



ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
22.06.2006, 17:50 Uhr
Fraenky



kurze Zwischenfrage: was ist jetzt der gespeicherte Parameter??
int von_vorne oder srand_init??

eher srand_init oder?

und muss ich den neuen Funktionsparameter von_vorne immer wieder neu übergeben? wenn ja, mit welchem Wert? 0? (null)?
--
Welcome to the real World.

www.fraenkysweb.de

Dieser Post wurde am 22.06.2006 um 17:56 Uhr von Fraenky editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
22.06.2006, 18:21 Uhr
Fraenky



hi!
also ohne zu wissen, als was von_vorne als Funktionsparamter übergeben werden sol, habe ich es einfach jetzt mit 0 (null) ausprobiert und kann sagen es klappt leider nicht.. :-/

Die erste Zeit wird noch angezeigt, aber dann kommt nur noch 0 bei zB 10 erzeugten Zufallszahlen.

Zu sagen ist vielleicht noch, dass ich die funktion zufall() in einer Klassse CZufall aufrufe:



C++:
//Anzhal der Textänge il Instanzen erzeugen..
CZufall *CZahl;
CZahl=new CZufall[il];
//Variablen
int *iZeit;
iZeit= new int[il];
...

// il Zufallszhalen erzeugen
for(i=0; i<il; i++)
{
CZahl[i].erzeugeZahl(min, max, 0);
}
//die dazugehörigen Zeiten dazu speichern
for(i=0; i<il; i++)
{
iZeit[i]=CZahl[i].returnZeit();
}



die Klassen Funktioen: (ja, eine Klassenfunktion müsste immer was zurückgeben...)


C++:
void CZufall::erzeugeZahl(int min, int max, int von_vorne)
{
    static int i = 1;
    bool vv = false;

    /* Beim ersten Aufruf den Startwert für srand ziehen und merken,
       außerdem mittels von_vorne = 1 erzwingen, dass srand () aufgerufen wird */

    if (i)
    {
        i = 0;
        zeit = time(NULL);
        vv = true;
    }

    /* Wenn die von_vorne-Flagge gesetzt ist, wird der anfangs gezogene Startwert
       neu gesetzt. Dadurch wiederholt sich ab jetzt die Folge der von rand ()
       gelieferten Zahlen. */

    if (vv)
    {
        srand (zeit);
    }

    zahl = min+rand()%(max-min+1);
}



und nochma in der Hauptfunktion, die ausgabe:


C++:
// Zahlen und Zeit zur Kontrolle ausgeben
cout << endl;
cout << " erzeugte Zahlen & Zeit:";
cout << endl << endl;
for(i=0; i<il; i++)
{
cout << " " << i << ": ";
CZahl[i].zeigeZahl();
cout << "\t";
CZahl[i].zeigeZeit();
cout << endl;
}



Ausgabe des Programmz, bei einem Wort mit zB 10 Buchstaben:
ausgabe

hoffe es hilft weiter..und lasste euch nciht so über meinen (nicht) standard der schreibweise aus..;-)

Mfg
Fraenky
--
Welcome to the real World.

www.fraenkysweb.de

Dieser Post wurde am 22.06.2006 um 18:29 Uhr von Fraenky editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
23.06.2006, 00:28 Uhr
ao

(Operator)



Zitat von Fraenky:
Zu sagen ist vielleicht noch, dass ich die funktion zufall() in einer Klassse CZufall aufrufe:

Ja, das hättest du wohl sagen sollen, dann wäre mein Vorschlag anders ausgefallen. Das, was du oben präsentiert hast, war keine Klassenfunktion

In dieser Situation würde ich erstes_mal und srand_init nicht als static-Variablen deklarieren, sondern als Klassen-Member (nicht-static).

Und warum du zehn verschiedene CZufall-Instanzen erzeugst, verstehe ich auch nicht; das sind 10 voneinander unabhängige Zufallsgeneratoren; willst du das?

Wie auch immer, das bool vv = false macht einiges kaputt, der Parameter von_vorne ist dadurch völlig wirkungslos geworden. Wenn dir nicht klar ist, wie der Code funktioniert, solltest du ihn mal mit einem Debugger Schritt für Schritt durchgehen.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
26.06.2006, 13:15 Uhr
Fraenky




Zitat von ao:

Und warum du zehn verschiedene CZufall-Instanzen erzeugst, verstehe ich auch nicht; das sind 10 voneinander unabhängige Zufallsgeneratoren; willst du das?



Hi!
ich habe jtzt nur einen Zufallsgenerator instanziert und weitere Variablen, in der ich die Zeit speichern wollte:


C++:
CZufall CZahl;

//Variablen
int *iZahl;
iZahl= new int[il];
int *iZeit;
iZeit= new int[il];

// Ausgabe

for(i=0; i<il; i++)
{
cout << " " << i+1 << ":\t";
iZahl[i];
cout << "\t\t";
iZeit[i];
cout << endl;
}



Leider wird überhaupt nichts ausgeben..


Zitat von ao:

Wenn dir nicht klar ist, wie der Code funktioniert, solltest du ihn mal mit einem Debugger Schritt für Schritt durchgehen.



Das hab ich noch nie gemacht, findet man da irgendwo eine Anleitung oder sowas? Ich benutzt auch Dev C++, wo kann man denn den Debugger nutzen und wie mach ich das?

danke..

MfG
Fraenky
--
Welcome to the real World.

www.fraenkysweb.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: