<?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[parallel random]]></title><description><![CDATA[<p>Hi,<br />
wie erzeugt man am besten Zufallszahlen in Threads?<br />
Beispiel:</p>
<pre><code class="language-cpp">const size_t N = 100000;
vector&lt;double&gt; num(N, 0);

random_gen r;

#pragma omp  parallel for /*entweder:*/private(r)
for(int n=0; n &lt; N; ++n)
{
    /*oder:*/ //#pragma omp critical
    num[n] = r();
}
</code></pre>
<p>Im Fall von <code>private (r)</code> arbeitet jeder Thread mit einem eigenen Generator mit unterschiedlichen seeds, etwas wie</p>
<pre><code class="language-cpp">struct random_gen
{
    random_gen()
    {
        mt.seed(++seed);
    }

    double operator()()
    {
        return dist(mt);
    }

    std::tr1::normal_distribution&lt;double&gt; dist;
    std::tr1::mt19937 mt;
    static unsigned long seed;
};
 unsigned long random_gen::seed = 1;
</code></pre>
<p>Das ist natürlich deutlich schneller als ein geteilter Generator. Aber wie sieht es mit der Qualität der Verteilung aus? Sieht zwar beim draufgucken gleich aus aber ist sie es auch? Kenn mich ja mit der Mathematik dahinter überhaupt nicht aus (ja hier gibts nen ausführlichen Artikel, ich weiß <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>oh 16:11 ... wm und ich sitz noch im büro :schland:</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/268606/parallel-random</link><generator>RSS for Node</generator><lastBuildDate>Tue, 01 Sep 2026 16:47:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/268606.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 11 Jun 2010 14:13:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to parallel random on Fri, 11 Jun 2010 14:13:43 GMT]]></title><description><![CDATA[<p>Hi,<br />
wie erzeugt man am besten Zufallszahlen in Threads?<br />
Beispiel:</p>
<pre><code class="language-cpp">const size_t N = 100000;
vector&lt;double&gt; num(N, 0);

random_gen r;

#pragma omp  parallel for /*entweder:*/private(r)
for(int n=0; n &lt; N; ++n)
{
    /*oder:*/ //#pragma omp critical
    num[n] = r();
}
</code></pre>
<p>Im Fall von <code>private (r)</code> arbeitet jeder Thread mit einem eigenen Generator mit unterschiedlichen seeds, etwas wie</p>
<pre><code class="language-cpp">struct random_gen
{
    random_gen()
    {
        mt.seed(++seed);
    }

    double operator()()
    {
        return dist(mt);
    }

    std::tr1::normal_distribution&lt;double&gt; dist;
    std::tr1::mt19937 mt;
    static unsigned long seed;
};
 unsigned long random_gen::seed = 1;
</code></pre>
<p>Das ist natürlich deutlich schneller als ein geteilter Generator. Aber wie sieht es mit der Qualität der Verteilung aus? Sieht zwar beim draufgucken gleich aus aber ist sie es auch? Kenn mich ja mit der Mathematik dahinter überhaupt nicht aus (ja hier gibts nen ausführlichen Artikel, ich weiß <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>oh 16:11 ... wm und ich sitz noch im büro :schland:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1910764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1910764</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Fri, 11 Jun 2010 14:13:43 GMT</pubDate></item></channel></rss>