<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Konzeptfrage zu srand()]]></title><description><![CDATA[<p>Hallo,<br />
wenn ich ein Projekt schreiben wollte, in dem eine Funktion rand() benutzt, sollte ich ja vorher sicher gehen, dass srand() initialisiert ist.<br />
Sollte ich in dem Falle srand() einmal selber initialisieren, oder diese Aufgabe dem Benutzer überlassen?</p>
<pre><code class="language-cpp">//funktion.h. srand() selbst initialisieren
#ifndef funktion_h
#define funktion_h

bool initialized = false; //eine böse globale Variable :D

void funktion()
{
    if(!initialized)
    {
        srand(time(0));
        initialized = true;
    }
    rand();
}

#endif
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/248828/konzeptfrage-zu-srand</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 17:04:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/248828.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 29 Aug 2009 21:02:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konzeptfrage zu srand() on Sat, 29 Aug 2009 21:02:17 GMT]]></title><description><![CDATA[<p>Hallo,<br />
wenn ich ein Projekt schreiben wollte, in dem eine Funktion rand() benutzt, sollte ich ja vorher sicher gehen, dass srand() initialisiert ist.<br />
Sollte ich in dem Falle srand() einmal selber initialisieren, oder diese Aufgabe dem Benutzer überlassen?</p>
<pre><code class="language-cpp">//funktion.h. srand() selbst initialisieren
#ifndef funktion_h
#define funktion_h

bool initialized = false; //eine böse globale Variable :D

void funktion()
{
    if(!initialized)
    {
        srand(time(0));
        initialized = true;
    }
    rand();
}

#endif
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1769023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1769023</guid><dc:creator><![CDATA[Gilder]]></dc:creator><pubDate>Sat, 29 Aug 2009 21:02:17 GMT</pubDate></item><item><title><![CDATA[Reply to Konzeptfrage zu srand() on Sat, 29 Aug 2009 21:06:49 GMT]]></title><description><![CDATA[<p>Warum sollte sich der Benutzer mit solchen technischen Details befassen? Der einzige Grund für sowas wäre, wenn du tatsächlich den Standardzufallsgenerator meinst, da dieser eventuell vom Benutzer selbst benutzt wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1769027</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1769027</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 29 Aug 2009 21:06:49 GMT</pubDate></item><item><title><![CDATA[Reply to Konzeptfrage zu srand() on Sat, 29 Aug 2009 21:05:34 GMT]]></title><description><![CDATA[<p>Du meinst wie ein Shortcut, mit dem der Benutzer srand 'aufrufen' kann?? Nö, mach's einfach selbst...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1769028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1769028</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Sat, 29 Aug 2009 21:05:34 GMT</pubDate></item><item><title><![CDATA[Reply to Konzeptfrage zu srand() on Sat, 29 Aug 2009 21:37:45 GMT]]></title><description><![CDATA[<p>für so etwas gibts aber static:</p>
<pre><code class="language-cpp">void funktion() 
{ 
    static bool initialized = false;
    if(!initialized)
    { 
        srand(time(0)); 
        initialized = true; 
    } 
    rand(); 
}
</code></pre>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1769050</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1769050</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 29 Aug 2009 21:37:45 GMT</pubDate></item><item><title><![CDATA[Reply to Konzeptfrage zu srand() on Sat, 29 Aug 2009 21:39:54 GMT]]></title><description><![CDATA[<p>Gilder schrieb:</p>
<blockquote>
<p>Sollte ich in dem Falle srand() einmal selber initialisieren, oder diese Aufgabe dem Benutzer überlassen?</p>
</blockquote>
<p><div class="plugin-markdown"><input type="checkbox" id="checkbox245667" checked="true" /><label for="checkbox245667">Dem Benutzer überlassen. Manchmal kann es praktisch sein, dass rand() deterministisch ist.</label></div></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1769052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1769052</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sat, 29 Aug 2009 21:39:54 GMT</pubDate></item><item><title><![CDATA[Reply to Konzeptfrage zu srand() on Sat, 29 Aug 2009 22:45:03 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13210">@Badestrand</a>: In den meisten Fällen will man Zufall. Ich fände es besser, für deterministische Folgen eine Extrafunktion aka set_seed einzurichten. Dann kann der Nutzer diese immer noch aufrufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1769078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1769078</guid><dc:creator><![CDATA[Randensaft]]></dc:creator><pubDate>Sat, 29 Aug 2009 22:45:03 GMT</pubDate></item><item><title><![CDATA[Reply to Konzeptfrage zu srand() on Sat, 29 Aug 2009 23:32:16 GMT]]></title><description><![CDATA[<p>Randensaft schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13210">@Badestrand</a>: In den meisten Fällen will man Zufall. Ich fände es besser, für deterministische Folgen eine Extrafunktion aka set_seed einzurichten. Dann kann der Nutzer diese immer noch aufrufen.</p>
</blockquote>
<p>Ich musste mal einen Bug fixen, der nur sehr selten und abhängig der von rand() produzierten Werte auftrat. Ein &quot;Lauf&quot; der Software, bis der Bug dann auftrat, hat aber ewig gedauert (ein paar Tage), deshalb war's ganz cool die Werte nachvollziehen zu können:</p>
<pre><code class="language-cpp">int main()
{
    DWORD now = GetTickCount();
    log &lt;&lt; &quot;Seeding with &quot; &lt;&lt; now &lt;&lt; &quot;\n&quot;;
    srand( now );
    ...
}
</code></pre>
<p>Trat dann ein Fehler auf, hatte man den Seed in der Logdatei und konnte den Lauf reproduzieren:</p>
<pre><code class="language-cpp">int main()
{
    srand( BUGGY_SEED_VALUE );
    ...
}
</code></pre>
<p>Auch für Tests kann's nützlich sein. Angenommen, du hast Algorithmen, die ein wenig mit Zufall arbeiten und der valide Wertebereich nicht sinnvoll weit genug eingeschränkt werden kann. Um automatisiert sicherzustellen, dass das ganze System immer noch läuft wie gedacht, produzierst du initial einfach ein paar Datensätze mit bestimmten Seed-Werten, lässt die Tests mit denselben Seed-Werten arbeiten und vergleichst die Datensätze (natürlich muss man dann neue Referenz-Datensätze generieren, wenn man die Algos ändert). War übrigens im selben Projekt.</p>
<p>Seitdem hab ich's gern, wenn mir niemand an meinen Seed-Werten rum-murkst. Ein <code>srand(time(NULL))</code> am Anfang kriegt der Nutzer wohl noch hin, auf ein <code>set_seed</code> oder irgendwas per Präprozessor-Schalter würde ich mich aber auch einlassen (nur halt nicht, dass man in Libraries wurschteln muss um das Seeden auszuschalten) <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1769091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1769091</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sat, 29 Aug 2009 23:32:16 GMT</pubDate></item><item><title><![CDATA[Reply to Konzeptfrage zu srand() on Sun, 30 Aug 2009 04:47:48 GMT]]></title><description><![CDATA[<p>Gilder schrieb:</p>
<blockquote>
<p>Sollte ich in dem Falle srand() einmal selber initialisieren, oder diese Aufgabe dem Benutzer überlassen?</p>
</blockquote>
<p>definierte benutzer</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1769106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1769106</guid><dc:creator><![CDATA[wat????]]></dc:creator><pubDate>Sun, 30 Aug 2009 04:47:48 GMT</pubDate></item><item><title><![CDATA[Reply to Konzeptfrage zu srand() on Sun, 30 Aug 2009 11:31:53 GMT]]></title><description><![CDATA[<p>Wenn das ein C++-Projekt ist und du g++ &gt;= 4.3 oder Boost benutzt (für MSVC weiß ich nicht genau ob und ab wann die TR1-libs drin sind), dann solltest du den Standardzufallsgenerator in Ruhe lassen und deinen eigenen, lib-internen mit <a href="http://www.johndcook.com/cpp_TR1_random.html" rel="nofollow">tr1::random</a> benutzen. Damit hast du Kontrolle darüber, dass er initialisiert ist, musst bei richtiger Wahl der Verteilung nichts umwandeln und hast mit dem Mersenne Twister deutlich &quot;zufälligere&quot; Zahlen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1769206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1769206</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Sun, 30 Aug 2009 11:31:53 GMT</pubDate></item><item><title><![CDATA[Reply to Konzeptfrage zu srand() on Sun, 30 Aug 2009 11:58:12 GMT]]></title><description><![CDATA[<p>.filmor schrieb:</p>
<blockquote>
<p>Wenn das ein C++-Projekt ist und du g++ &gt;= 4.3 oder Boost benutzt (für MSVC weiß ich nicht genau ob und ab wann die TR1-libs drin sind), dann solltest du den Standardzufallsgenerator in Ruhe lassen und deinen eigenen, lib-internen mit <a href="http://www.johndcook.com/cpp_TR1_random.html" rel="nofollow">tr1::random</a> benutzen. Damit hast du Kontrolle darüber, dass er initialisiert ist, musst bei richtiger Wahl der Verteilung nichts umwandeln und hast mit dem Mersenne Twister deutlich &quot;zufälligere&quot; Zahlen.</p>
</blockquote>
<p>Hä???<br />
Tu mal nicht so, als sei rand() kacke. mersenne ist lahm, rand() ist schnell und zufällig genug.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1769210</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1769210</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 30 Aug 2009 11:58:12 GMT</pubDate></item><item><title><![CDATA[Reply to Konzeptfrage zu srand() on Sun, 30 Aug 2009 12:35:04 GMT]]></title><description><![CDATA[<p>Geh mal nicht so an die Decke. rand() ist Kacke, das liegt aber nicht am verwendeten Algorithmus sondern an der Implementierung (statischer globaler Speicher und so :P). Das war auch eigentlich das, was ich sagen wollte. Einen Linearen Kongruenzgenerator hat man auch in den neuen Bibliotheken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1769241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1769241</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Sun, 30 Aug 2009 12:35:04 GMT</pubDate></item><item><title><![CDATA[Reply to Konzeptfrage zu srand() on Sun, 30 Aug 2009 14:22:27 GMT]]></title><description><![CDATA[<p>.filmor schrieb:</p>
<blockquote>
<p>rand() ist Kacke, das liegt aber nicht am verwendeten Algorithmus sondern an der Implementierung (statischer globaler Speicher und so :P)</p>
</blockquote>
<p>wo liegt das Problem? und nur weil deine implementierung von rand() kacke ist, trifft das nicht zwangsläufig allg. auf rand() zu... abgesehen von wirtschafts-simulationen o.ä. hab ich bisher noch nie probleme mit rand() gehabt...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1769295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1769295</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sun, 30 Aug 2009 14:22:27 GMT</pubDate></item><item><title><![CDATA[Reply to Konzeptfrage zu srand() on Sun, 30 Aug 2009 15:18:06 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>.filmor schrieb:</p>
<blockquote>
<p>rand() ist Kacke, das liegt aber nicht am verwendeten Algorithmus sondern an der Implementierung (statischer globaler Speicher und so :P)</p>
</blockquote>
<p>wo liegt das Problem? und nur weil deine implementierung von rand() kacke ist, trifft das nicht zwangsläufig allg. auf rand() zu... abgesehen von wirtschafts-simulationen o.ä. hab ich bisher noch nie probleme mit rand() gehabt...</p>
<p>bb</p>
</blockquote>
<p>Nenn mir eine rand() Implementierung, die keinen statischer globalen Speicher verwendet...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1769326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1769326</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 30 Aug 2009 15:18:06 GMT</pubDate></item><item><title><![CDATA[Reply to Konzeptfrage zu srand() on Sun, 30 Aug 2009 15:57:02 GMT]]></title><description><![CDATA[<p>wo liegt das problem? so ist das nun mal bei deterministischen Algorithmen</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1769352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1769352</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sun, 30 Aug 2009 15:57:02 GMT</pubDate></item><item><title><![CDATA[Reply to Konzeptfrage zu srand() on Sun, 30 Aug 2009 16:13:11 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>wo liegt das problem? so ist das nun mal bei deterministischen Algorithmen</p>
</blockquote>
<p>Das ist genau das Problem, worum es hier in diesem Thread geht: Wenn es nur einen globalen Zufallsgenerator gibt, dann ist man nicht selber für den Zufallsgenerator verantwortlich, sondern ist auch auf das Wohlwollen aller anderen angewiesen, die den Generator ebenfalls verwenden. Wie soll man wissen, ob nicht in irgendeiner Subroutine irgendeiner Bibliothek ein Napp vor jedem Aufruf von rand den Zufallsgenerator mit 0 initialisiert (wenn du dieses Forum kennst, weißt du wie oft Leute vor jedem rand srand benutzen) oder ob nicht irgendwer mit die Uhrzeit als seed setzt, obwohl man selber deterministisches Verhalten will. Das eingebaute rand ist daher wirklich nur allereinfachste Programme zu gebrauchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1769360</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1769360</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 30 Aug 2009 16:13:11 GMT</pubDate></item><item><title><![CDATA[Reply to Konzeptfrage zu srand() on Sun, 30 Aug 2009 16:56:28 GMT]]></title><description><![CDATA[<p>Japp, das stimmt - aber wie oft nimmt man denn bitte Libs, die den Zufallszahlengenerator neu initialisieren?<br />
Und:</p>
<blockquote>
<p>vor jedem Aufruf von rand den Zufallsgenerator mit 0 initialisiert</p>
</blockquote>
<p>Weil viele(wahrscheinlich fast alle^^) Anfänger Fehler damit machen, ist die Fkt. schlecht? Ich glaube nicht...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1769388</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1769388</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sun, 30 Aug 2009 16:56:28 GMT</pubDate></item><item><title><![CDATA[Reply to Konzeptfrage zu srand() on Tue, 01 Sep 2009 17:38:52 GMT]]></title><description><![CDATA[<p>Blubb.</p>
<p>Er sagte Projekt, dann gehe ich erstmal davon aus, dass es sich nicht um ein monolithisches Einmal-schreiben-Programm handelt sondern vielleicht ein bisschen modular ist. Wenn du rand verwendest kannst du den Determinismus vergessen. Meines Erachtens ist jede Bibliothek für ihren eigenen Zufall verantwortlich. Ist ja nicht nur so, dass du &quot;nur&quot; darauf verzichten musst. Du musst auch noch jedesmal locken, nur weil du eine Zufallszahl haben willst. Das gibt eine ganz tolle Threadingperformance bzw. wunderhübsches Verhalten, wenn's irgendwo im Code vergraben ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1770465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770465</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Tue, 01 Sep 2009 17:38:52 GMT</pubDate></item><item><title><![CDATA[Reply to Konzeptfrage zu srand() on Tue, 01 Sep 2009 20:19:55 GMT]]></title><description><![CDATA[<p>ok - da hast du wohl recht ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1770573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770573</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 01 Sep 2009 20:19:55 GMT</pubDate></item><item><title><![CDATA[Reply to Konzeptfrage zu srand() on Wed, 02 Sep 2009 07:59:46 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>.filmor schrieb:</p>
<blockquote>
<p>Wenn das ein C++-Projekt ist und du g++ &gt;= 4.3 oder Boost benutzt (für MSVC weiß ich nicht genau ob und ab wann die TR1-libs drin sind), dann solltest du den Standardzufallsgenerator in Ruhe lassen und deinen eigenen, lib-internen mit <a href="http://www.johndcook.com/cpp_TR1_random.html" rel="nofollow">tr1::random</a> benutzen. Damit hast du Kontrolle darüber, dass er initialisiert ist, musst bei richtiger Wahl der Verteilung nichts umwandeln und hast mit dem Mersenne Twister deutlich &quot;zufälligere&quot; Zahlen.</p>
</blockquote>
<p>Hä???<br />
Tu mal nicht so, als sei rand() kacke. mersenne ist lahm, rand() ist schnell und zufällig genug.</p>
</blockquote>
<p>a) ist der Mersenne Twister <em>deutlich</em> schneller, als lrand48 und b) woher weisst Du, ob lrand48 für das (hier nicht näher spezifizierte) Problem zufällig genug ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1770709</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770709</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 02 Sep 2009 07:59:46 GMT</pubDate></item><item><title><![CDATA[Reply to Konzeptfrage zu srand() on Wed, 02 Sep 2009 13:50:52 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>a) ist der Mersenne Twister <em>deutlich</em> schneller,</p>
</blockquote>
<p>Als ich den Mersenne Twister kennelernte, stand da was von &quot;viermal so schnell wie rand()&quot; und weil ich immer so neugierig bin, hatte ich es ausgemessen und er war in Wirklichkeit zweimal langsamer.</p>
<p>Tachyon schrieb:</p>
<blockquote>
<p>b) woher weisst Du, ob lrand48 für das (hier nicht näher spezifizierte) Problem zufällig genug ist?</p>
</blockquote>
<p>Für was ist rand() nicht zufällig genug? Doch nur für Krypto-Dinge und kryptofest ist der Mersenne Twister auch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1770932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770932</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 02 Sep 2009 13:50:52 GMT</pubDate></item><item><title><![CDATA[Reply to Konzeptfrage zu srand() on Wed, 02 Sep 2009 13:54:03 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Tachyon schrieb:</p>
<blockquote>
<p>a) ist der Mersenne Twister <em>deutlich</em> schneller,</p>
</blockquote>
<p>Als ich den Mersenne Twister kennelernte, stand da was von &quot;viermal so schnell wie rand()&quot; und weil ich immer so neugierig bin, hatte ich es ausgemessen und er war in Wirklichkeit zweimal langsamer.</p>
</blockquote>
<p>Hmm, bei mir ist der ca. 3 mal schneller. Dafür braucht er deutlich mehr Speicher.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>Tachyon schrieb:</p>
<blockquote>
<p>b) woher weisst Du, ob lrand48 für das (hier nicht näher spezifizierte) Problem zufällig genug ist?</p>
</blockquote>
<p>Für was ist rand() nicht zufällig genug? Doch nur für Krypto-Dinge und kryptofest ist der Mersenne Twister auch nicht.</p>
</blockquote>
<p>Simulationen z.B. bei denen Umgebungsrauschen o.ä. simuliert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1770934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770934</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 02 Sep 2009 13:54:03 GMT</pubDate></item></channel></rss>