rand(), srand(), randomize() ... welche Funktion macht denn nun was?
-
Ich habe bereits nachgeschaut, aber ich kann um's Verrecken nicht behalten, was die verschiedenen Funktionen für Zufallszahlen bewirken, vielleicht weil ich bis jetzt nicht mal eine Zeile Erklärung bekommen habe, WIE das geht. Könntet ihr mir helfen, den Funktionenmischmasch zu trennen?
-
es ist ganz einfach: mit srand musst du den zufallszahlengenarator einmalig intialisieren, und due kannst dir dann mit rand beliebig oft eine zufallszahl im bereich von 0 bis rand_max holen. randomize ist nur ein makro welches so aussehen könnte:
#define randomize() srand(time(0))
-
srand initialisiert den Zufallsgenerator. mit rand kannst Du einzelne Werte der Folge der Pseudozufallszahlen abfragen. "randomize" kenne ich nicht
-
Der aus dem Westen ... schrieb:
Ich habe bereits nachgeschaut
Wirklich? Benutze doch www.cplusplus.com, dort sind die Standard-Funktionen schön dokumentiert.
Woher hast du
randomize()
?
-
Nexus schrieb:
Woher hast du
randomize()
?Sie ist bei Borland schon seit Äonen dabei. Und das ist auch gut so. Wer sie nicht hat, schreibe sie sich schnell selber.
-
volkard schrieb:
Wer sie nicht hat, schreibe sie sich schnell selber.
Da stimme ich dir zu, aber dann bitte nicht als Makro, sondern als inline Funktion:
#include <ctime> #include <cstdlib> inline unsigned int seedStdCRandom() { std::time_t time = std::time(0); unsigned int seed = static_cast<unsigned int>(time); std::srand(seed); return seed; }
Grüssli
-
Klar als Funktion. Auch wenn ich mich auf
inline void randomize() { std::srand(std::time(0)); }
bescheiden würde.
-
ohne cast wird das ja wohl kaum ohne warning gehen : P
-
volkard schrieb:
Klar als Funktion. Auch wenn ich mich auf
inline void randomize() { std::srand(std::time(0)); }
bescheiden würde.
Wodurch du allerdings meistens eine Warnung bekommst (
std::time_t
undunsigned int
sind meistens nicht gleich), keine Log Möglichkeiten für den Seed hast und es auch für das Debuggen eher unangenehm ist. Zudem ist der Funktionsname absolut nichtsaussagendNachteile bei der Release Version hast du bei meiner gegenüber deiner Version aber sehr wahrscheinlich keine, da alles wegoptimiert werden kann. Und auch wenn es nicht der Fall ist, ist der Unterschied gering.
Grüssli
-
Also ich logge mir den seed auch gerne mit. Macht das Debuggen leichter.
-
Dravere schrieb:
Zudem ist der Funktionsname absolut nichtsaussagend
Hort, hört.
http://www.google.de/search?hl=de&q="c%2B%2B+randomize"&meta=
http://www.google.de/search?hl=de&q="c%2B%2B+seedStdCRandom"&meta=randomize ist nicht gerade unbekannt und ich verwende es, weil ich es nicht dokumentieren muß. ok, die warnung kann man schön mit einem (functional-style-)cast wegmachen. logst du seeds? habe ich noch nie gemacht.
ich sehe nur eine verbesserung, daß man am ende der randomize() noch einmal rand() aufruft, damit das erste vom user gesehene rand() nicht so einfach von Programmstart zu Programmstart aufsteigend ist.
-
Dravere schrieb:
Zudem ist der Funktionsname absolut nichtsaussagend
Oh, da kennt sich jemand sehr gut aus.
-
volkard schrieb:
Dravere schrieb:
Zudem ist der Funktionsname absolut nichtsaussagend
Hort, hört.
http://www.google.de/search?hl=de&q="c%2B%2B+randomize"&meta=
http://www.google.de/search?hl=de&q="c%2B%2B+seedStdCRandom"&meta=Hä? Ein Beweis mit Google? Weil alle A sagen ist auch A richtig, oder wie?
Ich finderandomize
ein schrecklicher Name, da er in keinem Kontext steht.randomize
was? Die Gurken in meinem Garten?
Nur weil der Name bei gewissen Implementationen üblich ist, heisst es doch nicht, dass er auch gut ist.volkard schrieb:
logst du seeds? habe ich noch nie gemacht.
So gut wie immer. Sehr praktisch, wenn du gleiche Abläufe nochmals wiederholen willst.
Grüssli
-
Dravere schrieb:
volkard schrieb:
Dravere schrieb:
Zudem ist der Funktionsname absolut nichtsaussagend
Hort, hört.
http://www.google.de/search?hl=de&q="c%2B%2B+randomize"&meta=
http://www.google.de/search?hl=de&q="c%2B%2B+seedStdCRandom"&meta=Hä? Ein Beweis mit Google? Weil alle A sagen ist auch A richtig, oder wie?
Ich finderandomize
ein schrecklicher Name, da er in keinem Kontext steht.randomize
was? Die Gurken in meinem Garten?
Nur weil der Name bei gewissen Implementationen üblich ist, heisst es doch nicht, dass er auch gut ist.volkard schrieb:
logst du seeds? habe ich noch nie gemacht.
So gut wie immer. Sehr praktisch, wenn du gleiche Abläufe nochmals wiederholen willst.
Grüssli
Ich sehe das genau so
Auch das loggen des Seeds ist eine sehr sinnvolle Sache. Auf diese Weise kann einen aufgetretenen Fehler einfach reproduzieren.
Des Weiteren werden bei Spielen meistens nur Seeds übertragen, um ein Level darzustellen. Alles in allem: Definitiv sinnvoll!
-
Dravere schrieb:
Ich finde
randomize
ein schrecklicher Name, da er in keinem Kontext steht.randomize
was? Die Gurken in meinem Garten?
Nur weil der Name bei gewissen Implementationen üblich ist, heisst es doch nicht, dass er auch gut ist.Genau. Ich hätte jetzt eher darauf getippt, dass die Funktion eine Zufallszahl in einem Bereich zurückgibt oder etwas in der Art. Aber als letztes, dass damit
srand()
aufgerufen wird.Allerdings finde ich
seedStdCRandom
auch schrecklich.
Ganz klar ist da nicht, was gemacht wird. Und das "C" verwirrt meiner Ansicht nach auch. Ich hätte eherInitRandSeed()
oder sowas gewählt, aber das ist auch Geschmackssache. Kommt auch ein wenig drauf an, ob man noch andere ähnliche Funktionen bereitstellt.
-
Nexus schrieb:
Genau. Ich hätte jetzt eher darauf getippt, dass die Funktion eine Zufallszahl in einem Bereich zurückgibt oder etwas in der Art. Aber als letztes, dass damit
srand()
aufgerufen wird.Vielleicht habe ich ja zu viel Basic geschnupft. http://msdn.microsoft.com/de-de/library/8zedbtdt(VS.80).aspx
-
Nexus schrieb:
Allerdings finde ich
seedStdCRandom
auch schrecklich.Gut, so ganz unrecht hast du nicht. Wie wäre es mit:
namespace cstd { inline unsigned int initRandomSeed() { // ... } } // ... int main() { cstd::initRandomSeed(); }
Oder als namespace eher
cexstd
(für c extended standard?)? Finde ich zwar nicht wirklich besserVielleicht läuft es aber dann auch wieder wirklich darauf hinaus:
Nexus schrieb:
..., aber das ist auch Geschmackssache. Kommt auch ein wenig drauf an, ob man noch andere ähnliche Funktionen bereitstellt.
Hauptsache ist immerhin, dass man erkennt, dass ein Seed gesetzt wird.
volkard schrieb:
Vielleicht habe ich ja zu viel Basic geschnupft.
Ist zwar ein wenig Off-Topic, aber darf ich fragen, wofür du noch Visual Basic einsetzt? Nur früher, noch heute nur Wartung oder noch heute auch neue Projekte? Und natürlich was für Projekte, vor allem wenn du noch neue damit anfängst.
Grüssli
-
Dravere schrieb:
Ich finde
randomize
ein schrecklicher Name, da er in keinem Kontext steht.Aber wenigstens bewahrt er die Tradition -
srand
ist auch nicht gerade sprechend.
-
Registrierter Troll schrieb:
Aber wenigstens bewahrt er die Tradition -
srand
ist auch nicht gerade sprechend.
Da fragt man sich zum Teil aber sowieso, was man sich beim C Standard eigentlich gedacht hat. Weiss das zufälligerweise jemand?
Absolute Favoriten sind da zum Beispiel:mbstowcs
oderwcstombs
. Man hat das Gefühl, jemand hätte wild irgendetwas eingetippt (ja, ich kenne die Bedeutung).Grüssli
-
Dravere schrieb:
wcstombs
.Tombs sind doch Gräber, WC sollte klar sein. Hm, was bedeutet wohl S? Safe? Sichere Toilettengräber?