<?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[Zufallszahlen im Wertebereich]]></title><description><![CDATA[<p>Hi zusammen:</p>
<p>Bin gerade dabei mir einen Zufallszahlengenerator zu schreiben, der mir innerhalb von einem zweidimensionalem Wertebereich Zufallszahlen ausspuckt.</p>
<p>Die Zufallszahl soll dabei vom Typ double sein, zudem kann der Wertebereich auch negativ sein.</p>
<p>Bisher verwende ich die folgende Funktion zum erstellen von Zufallszahlen.</p>
<pre><code class="language-cpp">double rnd()
 {
   const unsigned long a = 65539; // 2**31-1
   const unsigned long m = 2147483647; // 2**31-1
   static unsigned long xi = 7;
   xi = ( a * xi ) % m;
   return ( (double) xi / (double) m );
 }
</code></pre>
<p>Gibt es hier eine Möglichkeit den Wertebereich festzulegen in der die Zahl gezogen werden kann?<br />
Kann ich also zb.: Zufallszahlen vom Typ double im Bereich von -2.0 bis + 3.0 zulassen?</p>
<p>Alle zufallszahlengeneratoren die ich gefunden haben nur Zufallszahlen im positiven Wertebereich erzeugt, zudem meist nur Werte vom Typ Integer.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/226544/zufallszahlen-im-wertebereich</link><generator>RSS for Node</generator><lastBuildDate>Wed, 30 Sep 2026 15:00:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/226544.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 02 Nov 2008 23:12:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zufallszahlen im Wertebereich on Sun, 02 Nov 2008 23:12:52 GMT]]></title><description><![CDATA[<p>Hi zusammen:</p>
<p>Bin gerade dabei mir einen Zufallszahlengenerator zu schreiben, der mir innerhalb von einem zweidimensionalem Wertebereich Zufallszahlen ausspuckt.</p>
<p>Die Zufallszahl soll dabei vom Typ double sein, zudem kann der Wertebereich auch negativ sein.</p>
<p>Bisher verwende ich die folgende Funktion zum erstellen von Zufallszahlen.</p>
<pre><code class="language-cpp">double rnd()
 {
   const unsigned long a = 65539; // 2**31-1
   const unsigned long m = 2147483647; // 2**31-1
   static unsigned long xi = 7;
   xi = ( a * xi ) % m;
   return ( (double) xi / (double) m );
 }
</code></pre>
<p>Gibt es hier eine Möglichkeit den Wertebereich festzulegen in der die Zahl gezogen werden kann?<br />
Kann ich also zb.: Zufallszahlen vom Typ double im Bereich von -2.0 bis + 3.0 zulassen?</p>
<p>Alle zufallszahlengeneratoren die ich gefunden haben nur Zufallszahlen im positiven Wertebereich erzeugt, zudem meist nur Werte vom Typ Integer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1609164</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1609164</guid><dc:creator><![CDATA[redbomber]]></dc:creator><pubDate>Sun, 02 Nov 2008 23:12:52 GMT</pubDate></item><item><title><![CDATA[Reply to Zufallszahlen im Wertebereich on Mon, 03 Nov 2008 01:14:36 GMT]]></title><description><![CDATA[<p>redbomber schrieb:</p>
<blockquote>
<p>Alle zufallszahlengeneratoren die ich gefunden haben nur Zufallszahlen im positiven Wertebereich erzeugt, zudem meist nur Werte vom Typ Integer.</p>
</blockquote>
<p>Du könntest die positiven ganzen Zahlen manipulieren um auf z.b. Negative und floating point Zahlen zu kommen</p>
<p>EDIT:<br />
Hier stand Blödsinn...<br />
Glatt das static übersehen...bin wohl zu müde.. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Hier gibt es allerdings schon einen guten Artikel zum Thema Zufallszahlen...sieh dir den mal an <a href="http://c-plusplus.net/forum/viewtopic-var-t-is-172876-and-start-is-0.html" rel="nofollow">http://c-plusplus.net/forum/viewtopic-var-t-is-172876-and-start-is-0.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1609178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1609178</guid><dc:creator><![CDATA[Kuldren]]></dc:creator><pubDate>Mon, 03 Nov 2008 01:14:36 GMT</pubDate></item><item><title><![CDATA[Reply to Zufallszahlen im Wertebereich on Mon, 03 Nov 2008 09:03:22 GMT]]></title><description><![CDATA[<p>redbomber schrieb:</p>
<blockquote>
<p>Hi zusammen:</p>
<p>Bin gerade dabei mir einen Zufallszahlengenerator zu schreiben, der mir innerhalb von einem zweidimensionalem Wertebereich Zufallszahlen ausspuckt.</p>
<p>Die Zufallszahl soll dabei vom Typ double sein, zudem kann der Wertebereich auch negativ sein.</p>
<p>Bisher verwende ich die folgende Funktion zum erstellen von Zufallszahlen.</p>
<pre><code class="language-cpp">double rnd()
 {
   const unsigned long a = 65539; // 2**31-1
   const unsigned long m = 2147483647; // 2**31-1
   static unsigned long xi = 7;
   xi = ( a * xi ) % m;
   return ( (double) xi / (double) m );
 }
</code></pre>
<p>Gibt es hier eine Möglichkeit den Wertebereich festzulegen in der die Zahl gezogen werden kann?<br />
Kann ich also zb.: Zufallszahlen vom Typ double im Bereich von -2.0 bis + 3.0 zulassen?</p>
<p>Alle zufallszahlengeneratoren die ich gefunden haben nur Zufallszahlen im positiven Wertebereich erzeugt, zudem meist nur Werte vom Typ Integer.</p>
</blockquote>
<p>Du kannst auch die ganz normale rand()-Funktion aus der cstdlib benutzen:</p>
<pre><code class="language-cpp">double a = static_cast&lt;double&gt;(std::rand()) / RAND_MAX; // Werte von 0.0..1.0
double b = 2.0 * (a - 0.5); //von -1.0..1.0#
//usw.
</code></pre>
<p>Richtig gut ist boost.random, weil man da noch zwischen verschiedenen Algorithmen wählen kann. Der Mersenne Twister ist z.B. sehr gut, was Widerholungen und Performance betrifft.<br />
Außerdem kann man die Verteilung und den Wertebereich direkt angeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1609261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1609261</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 03 Nov 2008 09:03:22 GMT</pubDate></item><item><title><![CDATA[Reply to Zufallszahlen im Wertebereich on Mon, 03 Nov 2008 21:17:27 GMT]]></title><description><![CDATA[<p>redbomber schrieb:</p>
<blockquote>
<p>Bisher verwende ich die folgende Funktion zum erstellen von Zufallszahlen.</p>
<pre><code class="language-cpp">double rnd()
 {
   const unsigned long a = 65539; // 2**31-1
   const unsigned long m = 2147483647; // 2**31-1
   static unsigned long xi = 7;
   xi = ( a * xi ) % m;
   return ( (double) xi / (double) m );
 }
</code></pre>
</blockquote>
<p>der Ausdruck 'a * xi' führt recht schnell zu einem Overflow, da das Ergebnis größer wird als numeric_limits&lt;unsigned long&gt;::max() - vorausgesetzt, Dein long ist 32 Bit breit.</p>
<p>D.h. im Grunde steht da</p>
<pre><code class="language-cpp">xi = (( a * xi ) &amp; 0xFFFFFFFF) % m;
</code></pre>
<p>Das führt dazu, dass die Periode Deines Generators bei knapp über 100000 liegt. Wenn Du aus a einen long long machst (64 Bit breit) so steigert dass die Periode auf 1073741822 (=(m-1)/2) - also ein Vielfaches.</p>
<p>redbomber schrieb:</p>
<blockquote>
<p>Gibt es hier eine Möglichkeit den Wertebereich festzulegen in der die Zahl gezogen werden kann?<br />
Kann ich also zb.: Zufallszahlen vom Typ double im Bereich von -2.0 bis + 3.0 zulassen?</p>
</blockquote>
<p>Sicher - der Generator liefert Zahlen im Intervall (0.0, 1.0). Das kannst Du natürlich auf (-2.0, 3.0) aufblasen.</p>
<pre><code class="language-cpp">return ( (double) xi / (double) m ) * 5.0 - 2.0;
</code></pre>
<p>Eleganter und flexibler geht das ganze, wenn Du aus der Funktion zunächst mal einen Funktor machst, der die 'Roh'-Zufallszahlen liefert.</p>
<pre><code class="language-cpp">struct Rnd
{
    explicit Rnd( long xi = 7 )
        : m_xi( xi )
    {}
    static long min() { return 0; }
    static long max() { return m; }

    long operator()()
    {
        m_xi = ( a * m_xi ) % m;
        return m_xi;
    }
private:
    long m_xi;

    // Periode: 1073741822
    // Bereich: [3; 2147483646]
    static const long long a = 65539;; // 2**16+3
    static const long m = 2147483647; // 2**31-1
};
</code></pre>
<p>Dieser Funktor liefert seine Grenzen mit min() und max() und daraus lässt sich ähnlich wie oben jeder beliebige Bereich durch eine lineare Transformation einstellen.<br />
Code braucht man dazu auch nicht viel schreiben, denn das liefert bereits <a href="http://www.boost.org/doc/libs/1_37_0/libs/random/index.html" rel="nofollow">boost.random</a>. Hier die Verteilung '<a href="http://www.boost.org/doc/libs/1_37_0/libs/random/random-distributions.html#uniform_real" rel="nofollow">uniform_real</a>'.</p>
<pre><code class="language-cpp">#include &lt;boost/random/uniform_real.hpp&gt;

struct Rnd {/* s.o. */};

int main()
{
    using namespace std;

    boost::uniform_real&lt; double &gt; verteilung( -2.0, +3.0 );
    Rnd rnd;
    for( int n = 10; n; --n )
        cout &lt;&lt; verteilung( rnd ) &lt;&lt; endl;
    return 0;
}
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1609668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1609668</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Mon, 03 Nov 2008 21:17:27 GMT</pubDate></item><item><title><![CDATA[Reply to Zufallszahlen im Wertebereich on Mon, 03 Nov 2008 22:12:36 GMT]]></title><description><![CDATA[<p>und</p>
<pre><code class="language-cpp">verteilung( -2.0, +3.0 )
</code></pre>
<p>ist dann letztendlich welche Funktion?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1609696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1609696</guid><dc:creator><![CDATA[redbomber]]></dc:creator><pubDate>Mon, 03 Nov 2008 22:12:36 GMT</pubDate></item><item><title><![CDATA[Reply to Zufallszahlen im Wertebereich on Mon, 03 Nov 2008 22:18:31 GMT]]></title><description><![CDATA[<p>Das ist keine Funktion, sondern der Konstruktoraufruf eines Objekts vom Typ <code>boost::uniform_real&lt;double&gt;</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1609703</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1609703</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 03 Nov 2008 22:18:31 GMT</pubDate></item><item><title><![CDATA[Reply to Zufallszahlen im Wertebereich on Tue, 04 Nov 2008 20:21:53 GMT]]></title><description><![CDATA[<p>irgendwie funktioniert das noch immer nicht so ganz:</p>
<p>1. woran sehe ich hier die Grenzen:</p>
<pre><code class="language-cpp">return ( (double) xi / (double) m ) * 5.0 - 2.0;
</code></pre>
<p>Ok, mit -2 verschiebe ich den Wertebereich einfach wieder in Richtung der negativen Zahlen. Aber was bewirkt die 5?</p>
<ol start="2">
<li></li>
</ol>
<p>DIe Methode von <strong>Werner Salomon</strong> habe ich versucht einzubauen, jedoch erscheint bei mir immer die Fehlermeldung <strong>&quot;boost hast not been declared&quot;</strong><br />
Die benötigte <em>uniform_real.hpp</em> habe ich aber includiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1610280</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1610280</guid><dc:creator><![CDATA[redbomber]]></dc:creator><pubDate>Tue, 04 Nov 2008 20:21:53 GMT</pubDate></item><item><title><![CDATA[Reply to Zufallszahlen im Wertebereich on Tue, 04 Nov 2008 22:12:40 GMT]]></title><description><![CDATA[<p>redbomber schrieb:</p>
<blockquote>
<p>Ok, mit -2 verschiebe ich den Wertebereich einfach wieder in Richtung der negativen Zahlen. Aber was bewirkt die 5?</p>
</blockquote>
<p>Deine Zufallszahlen können ja zwischen 0 und 1 sein, also hast du eine Spannweite von 1. Durch die Multiplikation mit 5 erweiterst du das Intervall, sodass die Spannweite 5 beträgt.</p>
<p>redbomber schrieb:</p>
<blockquote>
<p>DIe Methode von <strong>Werner Salomon</strong> habe ich versucht einzubauen, jedoch erscheint bei mir immer die Fehlermeldung <strong>&quot;boost hast not been declared&quot;</strong><br />
Die benötigte <em>uniform_real.hpp</em> habe ich aber includiert.</p>
</blockquote>
<p>Du bist dir aber bewusst, dass der Namensraum <code>boost</code> für die Bibliothek Boost steht? Ansonsten schau mal <a href="http://www.boost.org/" rel="nofollow">hier</a>, Boost ist eine gute Erweiterung der Standardbibliothek und besitzt sehr mächtige Instrumente.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1610311</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1610311</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 04 Nov 2008 22:12:40 GMT</pubDate></item></channel></rss>