<?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[boost::random vs andere MersenneTwister Implementation]]></title><description><![CDATA[<p>Folgende Code-Beispiele zuerst:</p>
<p>Boost:</p>
<pre><code class="language-cpp">boost::uniform_real&lt;&gt; distance(min, max);
boost::variate_generator&lt;boost::rand48&amp;, boost::uniform_real&lt;&gt; &gt; dice(m_rand, distance);
return dice();
</code></pre>
<p>Ergebnis: <a href="http://www.abload.de/img/boost_randzzhg.png" rel="nofollow">http://www.abload.de/img/boost_randzzhg.png</a></p>
<p>Alternative mt19937 Implementation:</p>
<pre><code class="language-cpp">int r = (m_rand2.randInt()%(max-min))+min;
return r;
</code></pre>
<p>Ergebnis: <a href="http://www.abload.de/img/mtrandlzbo.png" rel="nofollow">http://www.abload.de/img/mtrandlzbo.png</a></p>
<p>Die zweite Implementation erzeugt definitiv bessere Ergebnisse.<br />
Mein Fehler oder woran liegt das?<br />
Die Frage stelle ich deswegen, weil die 2te Implementation etwas langsamer ist.<br />
Das Ergebnis gefällt mir aber weit besser.</p>
<p>Zur Erklärung: Die Sprite Positionen werden über den Zufallszahlen Generator erzeugt.<br />
Bei beiden Versuchen wurde das Random-Objekt (die Klasse) wiederverwendet.<br />
Beide bekamen den selben Seed:</p>
<pre><code class="language-cpp">int seed = timeGetTime();
</code></pre>
<p>edit: Jetzt habe ich im obigen Beispiel aus Versehen noch den rand48 drin als Generator, aber ich habs mit boost::mt19937 genauso versucht und das gleiche Ergebnis. Was mich btw sehr verwundert. Sollten 2 versch. Generatoren nicht unterschiedliche Ergebnisse produzieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/284849/boost-random-vs-andere-mersennetwister-implementation</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 17:24:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/284849.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 09 Apr 2011 17:30:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost::random vs andere MersenneTwister Implementation on Sat, 09 Apr 2011 17:38:59 GMT]]></title><description><![CDATA[<p>Folgende Code-Beispiele zuerst:</p>
<p>Boost:</p>
<pre><code class="language-cpp">boost::uniform_real&lt;&gt; distance(min, max);
boost::variate_generator&lt;boost::rand48&amp;, boost::uniform_real&lt;&gt; &gt; dice(m_rand, distance);
return dice();
</code></pre>
<p>Ergebnis: <a href="http://www.abload.de/img/boost_randzzhg.png" rel="nofollow">http://www.abload.de/img/boost_randzzhg.png</a></p>
<p>Alternative mt19937 Implementation:</p>
<pre><code class="language-cpp">int r = (m_rand2.randInt()%(max-min))+min;
return r;
</code></pre>
<p>Ergebnis: <a href="http://www.abload.de/img/mtrandlzbo.png" rel="nofollow">http://www.abload.de/img/mtrandlzbo.png</a></p>
<p>Die zweite Implementation erzeugt definitiv bessere Ergebnisse.<br />
Mein Fehler oder woran liegt das?<br />
Die Frage stelle ich deswegen, weil die 2te Implementation etwas langsamer ist.<br />
Das Ergebnis gefällt mir aber weit besser.</p>
<p>Zur Erklärung: Die Sprite Positionen werden über den Zufallszahlen Generator erzeugt.<br />
Bei beiden Versuchen wurde das Random-Objekt (die Klasse) wiederverwendet.<br />
Beide bekamen den selben Seed:</p>
<pre><code class="language-cpp">int seed = timeGetTime();
</code></pre>
<p>edit: Jetzt habe ich im obigen Beispiel aus Versehen noch den rand48 drin als Generator, aber ich habs mit boost::mt19937 genauso versucht und das gleiche Ergebnis. Was mich btw sehr verwundert. Sollten 2 versch. Generatoren nicht unterschiedliche Ergebnisse produzieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2046814</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2046814</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Sat, 09 Apr 2011 17:38:59 GMT</pubDate></item><item><title><![CDATA[Reply to boost::random vs andere MersenneTwister Implementation on Sat, 09 Apr 2011 17:40:21 GMT]]></title><description><![CDATA[<p>Bist du denn sicher, daß du die Generatoren nur ein mal initialisiert hast?</p>
<p>(PS: <a href="http://www.boost.org/doc/libs/1_34_0/libs/random/random-generators.html#rand48" rel="nofollow">boost::rand48</a> ist kein Mersenne-Twister <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2046821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2046821</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 09 Apr 2011 17:40:21 GMT</pubDate></item><item><title><![CDATA[Reply to boost::random vs andere MersenneTwister Implementation on Sat, 09 Apr 2011 17:42:53 GMT]]></title><description><![CDATA[<p>Ja, nur einmal initialisiert.<br />
Im Konstruktor eines Singletons (das einzige in meinem Programm).</p>
<p>Zum Code:<br />
Ja, hab aus versehen den rand48() Code kopiert.</p>
<pre><code>boost::uniform_real&lt;&gt; distance(min, max);
    boost::variate_generator&lt;boost::mt19937&amp;, boost::uniform_real&lt;&gt; &gt; dice(m_rand, distance);
    return dice();
</code></pre>
<p>Das wäre der richtige.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2046824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2046824</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Sat, 09 Apr 2011 17:42:53 GMT</pubDate></item><item><title><![CDATA[Reply to boost::random vs andere MersenneTwister Implementation on Sat, 09 Apr 2011 17:50:44 GMT]]></title><description><![CDATA[<p>Okay, nach einem Neustart schauts so aus:<br />
<a href="http://www.abload.de/img/boost_rand2e7ra.png" rel="nofollow">http://www.abload.de/img/boost_rand2e7ra.png</a><br />
Mit dem boost::mt19937.<br />
Ahjo, ich beobachte das mal weiter. Ich werd erstmal bei der boost version bleiben, weil die ist deutlich schneller.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2046833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2046833</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Sat, 09 Apr 2011 17:50:44 GMT</pubDate></item><item><title><![CDATA[Reply to boost::random vs andere MersenneTwister Implementation on Sat, 09 Apr 2011 17:56:47 GMT]]></title><description><![CDATA[<p>Hast du mal versucht, auch den variate_generator&lt;&gt; in deinem Singleton anzulegen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2046837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2046837</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 09 Apr 2011 17:56:47 GMT</pubDate></item><item><title><![CDATA[Reply to boost::random vs andere MersenneTwister Implementation on Sat, 09 Apr 2011 18:06:46 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Hast du mal versucht, auch den variate_generator&lt;&gt; in deinem Singleton anzulegen?</p>
</blockquote>
<p>Probiert ja, aber das geht nicht.</p>
<p>Visual C++ 2008 Prof. schrieb:</p>
<blockquote>
<p>Error 1 error C2512: 'boost::variate_generator&lt;Engine,Distribution&gt;' : no appropriate default constructor available d:\Source\NightLight2D\NightLightDLL\NLSystemController.cpp 49 NightLightDLL<br />
Error 4 error C2582: 'operator =' function is unavailable in 'boost::variate_generator&lt;Engine,Distribution&gt;' d:\Source\NightLight2D\NightLightDLL\NLSystemController.cpp 265 NightLightDLL</p>
</blockquote>
<p>Naja, bisher ist das Ergebnis stabil.<br />
Keine Ahnung ehrlich gesagt. Und ich hatte mit rand48 und boost::mt19937 wie gesagt das gleiche Ergebnis. Bzw seehr ähnlich dass alle Sprites in diesem schrägen Winkel angeordnet wurden.<br />
Das jetzige Ergebnis ist in Ordnung, das gefällt mir. Ist auch besser als die andere mt19937-Implementation vom Ergebnis her. Mehr noise, wenn man das so nennen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2046841</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2046841</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Sat, 09 Apr 2011 18:06:46 GMT</pubDate></item><item><title><![CDATA[Reply to boost::random vs andere MersenneTwister Implementation on Sat, 09 Apr 2011 18:42:39 GMT]]></title><description><![CDATA[<p>Scorcher24 schrieb:</p>
<blockquote>
<p>Das jetzige Ergebnis ist in Ordnung, das gefällt mir. Ist auch besser als die andere mt19937-Implementation vom Ergebnis her. Mehr noise, wenn man das so nennen kann.</p>
</blockquote>
<p>Das kann eigentlich nicht sein (es sei denn eine der beiden Implementierungen ist fehlerhaft). Jede (korrekte) MT-19937 Implementierung muss bei gleichem Seed die gleichen Zahlen erzeugen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2046864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2046864</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 09 Apr 2011 18:42:39 GMT</pubDate></item><item><title><![CDATA[Reply to boost::random vs andere MersenneTwister Implementation on Sat, 09 Apr 2011 18:45:16 GMT]]></title><description><![CDATA[<blockquote>
<p>// MersenneTwister.h<br />
// Mersenne Twister random number generator -- a C++ class MTRand<br />
// Based on code by Makoto Matsumoto, Takuji Nishimura, and Shawn Cokus<br />
// Richard J. Wagner v1.0 15 May 2003 <a href="mailto:rjwagner@writeme.com" rel="nofollow">rjwagner@writeme.com</a></p>
<p>// The Mersenne Twister is an algorithm for generating random numbers. It<br />
// was designed with consideration of the flaws in various other generators.<br />
// The period, 2^19937-1, and the order of equidistribution, 623 dimensions,<br />
// are far greater. The generator is also fast; it avoids multiplication and<br />
// division, and it benefits from caches and pipelines. For more information<br />
// see the inventors' web page at <a href="http://www.math.keio.ac.jp/~matumoto/emt.html" rel="nofollow">http://www.math.keio.ac.jp/~matumoto/emt.html</a></p>
<p>// Reference<br />
// M. Matsumoto and T. Nishimura, &quot;Mersenne Twister: A 623-Dimensionally<br />
// Equidistributed Uniform Pseudo-Random Number Generator&quot;, ACM Transactions on<br />
// Modeling and Computer Simulation, Vol. 8, No. 1, January 1998, pp 3-30.</p>
<p>// Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,<br />
// Copyright (C) 2000 - 2003, Richard J. Wagner<br />
// All rights reserved.</p>
</blockquote>
<p>Das ist die &quot;andere&quot; Implementation von der ich sprach.<br />
Und ja, sorry, ich kann auch nix dafür....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2046867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2046867</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Sat, 09 Apr 2011 18:45:16 GMT</pubDate></item><item><title><![CDATA[Reply to boost::random vs andere MersenneTwister Implementation on Sat, 09 Apr 2011 18:59:45 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Scorcher24 schrieb:</p>
<blockquote>
<p>Das jetzige Ergebnis ist in Ordnung, das gefällt mir. Ist auch besser als die andere mt19937-Implementation vom Ergebnis her. Mehr noise, wenn man das so nennen kann.</p>
</blockquote>
<p>Das kann eigentlich nicht sein (es sei denn eine der beiden Implementierungen ist fehlerhaft). Jede (korrekte) MT-19937 Implementierung muss bei gleichem Seed die gleichen Zahlen erzeugen.</p>
</blockquote>
<p>Was eventuell einen Unterschied bewirken könnte, ist die Nachbehandlung der ermittelten Zufallszahlen durch die Distribution (bei Boost) bzw. die Modulo-Konstruktion. Der uniform_real&lt;&gt; arbeitet mit double-Werten und liefert dadurch auch Zwischenwerte (ja, ich habe mir extra für dich die Header von Boost angesehen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2046873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2046873</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 09 Apr 2011 18:59:45 GMT</pubDate></item><item><title><![CDATA[Reply to boost::random vs andere MersenneTwister Implementation on Sat, 09 Apr 2011 19:16:13 GMT]]></title><description><![CDATA[<p>Wenn Du beim Platzieren von Sprites solche Muster siehst, dann ist was ganz anderes faul. Auch mit std::rand darf das nicht passieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2046881</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2046881</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 09 Apr 2011 19:16:13 GMT</pubDate></item><item><title><![CDATA[Reply to boost::random vs andere MersenneTwister Implementation on Sat, 09 Apr 2011 19:42:09 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Wenn Du beim Platzieren von Sprites solche Muster siehst, dann ist was ganz anderes faul. Auch mit std::rand darf das nicht passieren.</p>
</blockquote>
<p>Kann das daran liegen, dass ich meine Maschine teilweise tagelang laufen habe und nur Hybernate nutze und nicht ganz abschalte?<br />
Weil <a href="http://msdn.microsoft.com/en-us/library/ms713418%28v=vs.85%29.aspx" rel="nofollow">timeGetTime()</a> gibt ja die ms zurück seit das System gestartet wurde.<br />
Und die nutzte ich als Seed. Habe das jetzt mal in std::time(NULL) geändert.<br />
Wie gesagt, seit nem Neustart tritt das nicht mehr auf.</p>
<p>Das ist jetzt mein fertiger Code:</p>
<pre><code class="language-cpp">class NLSystemController
{
/* [....] */
typedef boost::mt19937 TRandomGenerator;
typedef boost::uniform_int&lt;&gt; TRandomIntUniform;
typedef boost::variate_generator&lt;TRandomGenerator&amp;, TRandomIntUniform &gt; TIntVariateGen;

TRandomGenerator m_rand;
};

NLSystemController::NLSystemController()
: m_logbook(NULL), m_window(NULL)
{
    /* .... */   

    m_rand.seed(static_cast&lt;int&gt;(std::time(NULL)));
}

int NLSystemController::getRandomNumber( int min, int max )
{
    TRandomIntUniform distance(min, max);
    TIntVariateGen dice(m_rand, distance);
    return dice();
}

int NLSystemController::getRandomNumber()
{
    TRandomIntUniform distance;
    TIntVariateGen dice(m_rand, distance);
    return dice();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2046899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2046899</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Sat, 09 Apr 2011 19:42:09 GMT</pubDate></item></channel></rss>