N
kann ich das
CZufall::setzeSrand (static_cast<unsigned int> (time (NULL));
auch in einen Kontruktor packen, um es nicht in der main() Funktion aufrufen zu müssen?
Dann würdest Du es ja wieder für jede Zahl einzeln aufrufen, da der Konstruktor jedesmal beim Erstellen einer Variable von dem Typ aufgerufen wird. Und in Deinem Fall mit dem Zahlenfeld wären das dann sovielmal wie Du Zahlen hast.
Leider bekomme ich keine Ausgabe der (unterschiedlichen) Zeiten...
mit [...] bekomme ich zwar unterschiedliche Zufallszahlen,aber die Zeiten sind alle gleich..
Ja, gut, das Erstellen dauert ja nur einen ganz kurzen Augenblick. Das heißt, wenn er es in einer Millisekunde schafft, Dein Feld zu deklarieren und den Konstruktor entsprechend oft aufzurufen, dann ist es natürlich klar, daß time (NULL) immer den gleichen Wert, eben den, der in dieser Millisekunde dran war, liefert.
Ich brauche kein Objekt? Also ich instanziere il Objekte, halt so viele, wie ich Zufallszahlen brauche:
Ich sagte, wenn Du eine Funktion oder eine Variable static machst, dann brauchst Du kein Objekt, um sie zu benutzen. Wenn Du in Deiner Klasse also die Membervariable int zahl hast und Du erstellst ein Feld mit 10 Objekten dieser Klasse, dann hat natürlich jedes Objekt/jeder Feldeintrag eine eigene Membervariable zahl. Hast Du allerdings eine Membervariable static unsigned int srandWert, dann gibt es diese Variable nur einmal, egal, wie viele Objekte Du hast. Alle Objekte teilen sich diese Variable und infolgedessen brauchst Du nichtmal ein Objekt, sondern kannst die Variable auch direkt aufrufen (wenn sie public wäre). Das gleiche gilt für statische Funktionen. Auch für sie brauchst Du kein Objekt, sondern kannst sie gleich mit CZufall::setzeSrand (...) aufrufen.
Kann man trotzdem jeden Nachfolge Seed, der von rand() produziert wird, speichern??
Soweit ich das sehe, ist die Zufallszahl, die Du bekommst, der nächste Seed. Die Funktion srand sieht im Wesentlichen folgendermaßen aus:
void srand (unsigned int seed)
{
holdrand=(long) seed;
}
(Ich habe den ganzen Schnickschnack, wie #ifdef, in das er sowieso nicht reingeht, und dieses __cdecl mal rausgenommen, damit Du die wesentliche Funktionsweise sehen kannst. holdrand scheint wohl eine globale Variable zu sein. Die rand-Funktion sieht dann analog so aus:
int rand ()
{
return ((holdrand=holdrand*214013L+2531011L)>>16)&0x7fff;
}
Wie Du siehst, liefert er eine Zufallszahl zurück, die auch gleichzeitig das neue holdrand ist.
Ich frage mich jetzt jedoch immer noch, warum Du da jede einzelne Zeit speichern willst. Und warum Du vor jeder Zufallszahl das srand machen wolltest (srand in den Konstruktor packen). Vielleicht hast Du es ja bereits verstanden, aber falls nicht, schreibe ich Dir nochmal etwas dazu: Die srand-Funktion liefert einen "Größenfaktor", anhand dessen Zufallszahlen erzeugt werden. Dieser Faktor stellt sozusagen die Anfangsbedingung dar. Da der Computer nicht in der Lage ist, echte Zufallszahlen zu ermitteln, muß man ihm eine Anfangszahl nennen, aus der er dann die Zufallszahlen generiert. Ein Anfangswert, eine Startbedingung. Und schon kann man sich Zufallszahlen ausgeben lassen. Deshalb ruft man srand auch nicht mehrmals auf, da es ja die Startbedingung darstellt. Es macht nicht allzuviel Sinn bzw. es ist zu umständlich, für jede neue Zufallszahl eine eigene Startbedingung zu schaffen. Deshalb ruft man srand nur einmal auf. Will man die Meßreihe an Zufallszahlen rekonstruieren, merkt man sich am Anfang den Wert, den man srand übergibt (und deshalb sagte ich: mach die srand-Wert-Variable static, so hast Du unabhängig von der Anzahl Deiner Zufallszahlen nur einen Startwert, der trotzdem in der Klasse gespeichert wird und nicht außerhalb irgendwo rumliegen muß). Beim zweiten Durchlauf, der wieder die gleichen Zufallszahlen liefern soll, ruft man srand wieder auf (und legt damit eine neue Startbedingung fest) und übergibt der Funktion den alten Startwert.