<?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[OpenMP und C++11 Zufallszahlengenerator]]></title><description><![CDATA[<p>Hallo ihr Lieben,</p>
<p>durch einen <a href="http://www.c-plusplus.net/forum/325670" rel="nofollow">anderen Thread</a> wurde ich angeregt einen Teil meines Quellcodes neu zu überdenken.</p>
<p>Ich bin von C++11 und seinen Zufallszahlengeneratoren begeistert, die sich einfach kopieren lassen. Im Beispiel initialisiere ich eine Klasse und gebe mittels <code>firstprivate</code> jedem Thread eine eigene Kopie. Da ich in <code>RNG</code> einen Kopierkonstruktor habe geht das ohne Probleme.</p>
<p>Das Problem ist nun, dass durch das Kopieren der Zustand des Generators (von dem kopiert wurde) nicht verändert wird! Wenn ich das ganze parallelisierte Prozedere wiederhole sehe ich die gleichen Zufallszahlen - klar!</p>
<p>Aber wie kann ich das vermeiden? Als quick und dirty Lösung dachte ich daran den Zufallsgenerator einfach in dem parallelisierten Block anhand der Zeit zu initialisieren, also jedes Mal mit neuem Seed zu initialiseren. Finde ich aber unschön.</p>
<p>Ich muss also den Kopierkonstrutor so schreiben, dass er ... ja was? Einen Pointer verwendet? Auf dass jede Verwendung in dem pragma Block tatsächlich den Zustand von <code>rng</code> verändert? Ist das dann thread safe?</p>
<pre><code class="language-cpp">#ifndef RNG_H
#define RNG_H

#include &lt;iostream&gt;
#include &lt;random&gt;
#include &lt;vector&gt;

#include &quot;omp.h&quot;

using namespace std;

class RNG
{
	public:
		RNG(int);
		RNG(const RNG&amp;);

		auto operator()()	-&gt; double;

		RNG&amp; operator=(const RNG&amp;)	= delete;
		RNG(RNG&amp;&amp;)									= delete;
		RNG&amp; operator=(RNG&amp;&amp;)				= delete;

	private:
		vector&lt;mt19937&gt; _engines;
		uniform_real_distribution&lt;double&gt; _distribution;

};
#endif
</code></pre>
<pre><code class="language-cpp">#include &quot;rng-omp.h&quot;

/* constructor */
RNG::RNG( int threads ): _engines(), _distribution( 0.0 , 1.0 )
{
	for(int i = 0; i &lt; threads; ++i)
		_engines.push_back( mt19937( i ) );
}

/* copy constructor */
RNG::RNG(const RNG&amp; rhs):
	_engines( rhs._engines ), _distribution( rhs._distribution )
{}

/* get uniform distributed random number in (0,1) */
auto RNG::operator()() -&gt; double
{
	return _distribution( _engines[ omp_get_thread_num() ] );
}
</code></pre>
<pre><code class="language-cpp">#include &lt;iostream&gt;

#include &quot;rng-omp.h&quot;

int main()
{
	int const threads = 8;

	omp_set_num_threads( threads );

	RNG rng(threads);

	#pragma omp parallel firstprivate( rng )
	{
		#pragma omp critical
		{
			cout	&lt;&lt; &quot;random number from thread &quot;
						&lt;&lt; omp_get_thread_num()	&lt;&lt;	&quot;: &quot;	&lt;&lt; rng()
						&lt;&lt; endl;
		}
	}

	cout &lt;&lt; &quot;\nNext sequence!\n&quot; &lt;&lt; endl;

	#pragma omp parallel firstprivate( rng )
	{
		#pragma omp critical
		{
			cout	&lt;&lt; &quot;random number from thread &quot;
						&lt;&lt; omp_get_thread_num()	&lt;&lt;	&quot;: &quot;	&lt;&lt; rng()
						&lt;&lt; endl;
		}
	}

	return 0;
}
</code></pre>
<p>Ausgabe</p>
<pre><code>random number from thread 0: 0.592845
random number from thread 5: 0.0551801
random number from thread 2: 0.185082
random number from thread 1: 0.997185
random number from thread 6: 0.947476
random number from thread 3: 0.0707249
random number from thread 4: 0.900621
random number from thread 7: 0.227339

Next sequence!

random number from thread 4: 0.900621
random number from thread 2: 0.185082
random number from thread 1: 0.997185
random number from thread 5: 0.0551801
random number from thread 3: 0.0707249
random number from thread 0: 0.592845
random number from thread 6: 0.947476
random number from thread 7: 0.227339
</code></pre>
<p>Gruß,<br />
-- Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/325700/openmp-und-c-11-zufallszahlengenerator</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Jul 2026 19:37:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/325700.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 14 May 2014 09:29:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to OpenMP und C++11 Zufallszahlengenerator on Wed, 14 May 2014 09:39:17 GMT]]></title><description><![CDATA[<p>Hallo ihr Lieben,</p>
<p>durch einen <a href="http://www.c-plusplus.net/forum/325670" rel="nofollow">anderen Thread</a> wurde ich angeregt einen Teil meines Quellcodes neu zu überdenken.</p>
<p>Ich bin von C++11 und seinen Zufallszahlengeneratoren begeistert, die sich einfach kopieren lassen. Im Beispiel initialisiere ich eine Klasse und gebe mittels <code>firstprivate</code> jedem Thread eine eigene Kopie. Da ich in <code>RNG</code> einen Kopierkonstruktor habe geht das ohne Probleme.</p>
<p>Das Problem ist nun, dass durch das Kopieren der Zustand des Generators (von dem kopiert wurde) nicht verändert wird! Wenn ich das ganze parallelisierte Prozedere wiederhole sehe ich die gleichen Zufallszahlen - klar!</p>
<p>Aber wie kann ich das vermeiden? Als quick und dirty Lösung dachte ich daran den Zufallsgenerator einfach in dem parallelisierten Block anhand der Zeit zu initialisieren, also jedes Mal mit neuem Seed zu initialiseren. Finde ich aber unschön.</p>
<p>Ich muss also den Kopierkonstrutor so schreiben, dass er ... ja was? Einen Pointer verwendet? Auf dass jede Verwendung in dem pragma Block tatsächlich den Zustand von <code>rng</code> verändert? Ist das dann thread safe?</p>
<pre><code class="language-cpp">#ifndef RNG_H
#define RNG_H

#include &lt;iostream&gt;
#include &lt;random&gt;
#include &lt;vector&gt;

#include &quot;omp.h&quot;

using namespace std;

class RNG
{
	public:
		RNG(int);
		RNG(const RNG&amp;);

		auto operator()()	-&gt; double;

		RNG&amp; operator=(const RNG&amp;)	= delete;
		RNG(RNG&amp;&amp;)									= delete;
		RNG&amp; operator=(RNG&amp;&amp;)				= delete;

	private:
		vector&lt;mt19937&gt; _engines;
		uniform_real_distribution&lt;double&gt; _distribution;

};
#endif
</code></pre>
<pre><code class="language-cpp">#include &quot;rng-omp.h&quot;

/* constructor */
RNG::RNG( int threads ): _engines(), _distribution( 0.0 , 1.0 )
{
	for(int i = 0; i &lt; threads; ++i)
		_engines.push_back( mt19937( i ) );
}

/* copy constructor */
RNG::RNG(const RNG&amp; rhs):
	_engines( rhs._engines ), _distribution( rhs._distribution )
{}

/* get uniform distributed random number in (0,1) */
auto RNG::operator()() -&gt; double
{
	return _distribution( _engines[ omp_get_thread_num() ] );
}
</code></pre>
<pre><code class="language-cpp">#include &lt;iostream&gt;

#include &quot;rng-omp.h&quot;

int main()
{
	int const threads = 8;

	omp_set_num_threads( threads );

	RNG rng(threads);

	#pragma omp parallel firstprivate( rng )
	{
		#pragma omp critical
		{
			cout	&lt;&lt; &quot;random number from thread &quot;
						&lt;&lt; omp_get_thread_num()	&lt;&lt;	&quot;: &quot;	&lt;&lt; rng()
						&lt;&lt; endl;
		}
	}

	cout &lt;&lt; &quot;\nNext sequence!\n&quot; &lt;&lt; endl;

	#pragma omp parallel firstprivate( rng )
	{
		#pragma omp critical
		{
			cout	&lt;&lt; &quot;random number from thread &quot;
						&lt;&lt; omp_get_thread_num()	&lt;&lt;	&quot;: &quot;	&lt;&lt; rng()
						&lt;&lt; endl;
		}
	}

	return 0;
}
</code></pre>
<p>Ausgabe</p>
<pre><code>random number from thread 0: 0.592845
random number from thread 5: 0.0551801
random number from thread 2: 0.185082
random number from thread 1: 0.997185
random number from thread 6: 0.947476
random number from thread 3: 0.0707249
random number from thread 4: 0.900621
random number from thread 7: 0.227339

Next sequence!

random number from thread 4: 0.900621
random number from thread 2: 0.185082
random number from thread 1: 0.997185
random number from thread 5: 0.0551801
random number from thread 3: 0.0707249
random number from thread 0: 0.592845
random number from thread 6: 0.947476
random number from thread 7: 0.227339
</code></pre>
<p>Gruß,<br />
-- Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399108</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Wed, 14 May 2014 09:39:17 GMT</pubDate></item><item><title><![CDATA[Reply to OpenMP und C++11 Zufallszahlengenerator on Wed, 14 May 2014 10:50:12 GMT]]></title><description><![CDATA[<p>Das ganze System sieht mir nicht so sinnvoll aus.</p>
<p>Wenn du Zufallszahlen willst, wieso erzeugst du dir nicht in jedem eigenen Thread einen Generator? Wieso willst du die Zusammenfassen?</p>
<p>Dann: In deinem Code hättest du eigentlich eine schöne Abgrenzung, mehrere Generatoren für mehrere Threads. Aber dann nutzt du im double operator() eine OMP-Funktion, die dir die schöne Abgrenzung kaputt macht und die Kopplung erhöht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399128</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Wed, 14 May 2014 10:50:12 GMT</pubDate></item><item><title><![CDATA[Reply to OpenMP und C++11 Zufallszahlengenerator on Wed, 14 May 2014 11:47:58 GMT]]></title><description><![CDATA[<p>Hallo Skym0sh0,</p>
<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Wenn du Zufallszahlen willst, wieso erzeugst du dir nicht in jedem eigenen Thread einen Generator? Wieso willst du die Zusammenfassen?</p>
<p>Dann: In deinem Code hättest du eigentlich eine schöne Abgrenzung, mehrere Generatoren für mehrere Threads. Aber dann nutzt du im double operator() eine OMP-Funktion, die dir die schöne Abgrenzung kaputt macht und die Kopplung erhöht.</p>
</blockquote>
<p>Okay,<br />
ich gebe jedem Thread einen eigenen (neu entworfenen) Zufallszahlengenerator. Jetzt habe ich aber nach wie vor das Problem, dass die erste und zweite Sequenz dieselben Zufallszahlen liefern.<br />
Diese nacheinander aufgerufenen parallelen Blöcke stehen symbolisch für eine immer wieder aufgerufene Funktion, die einen Datensatz mit Zufallszahlen bearbeiten.</p>
<p>Irgendwie muss ich doch aber dafür sorgen, dass wiederholte Aufrufe derselben Funktion mit neuen Sequenzen von Zufallszahlen versorgt werden. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Gruß,<br />
-- Klaus.</p>
<pre><code class="language-cpp">#ifndef RNG_H
#define RNG_H

#include &lt;iostream&gt;
#include &lt;random&gt;

#include &quot;omp.h&quot;

using namespace std;

class RNG
{
	public:
		RNG(int seed):
			_engine( seed ), _distribution( 0.0, 1.0 ){};

		double operator()(){ return _distribution( _engine ); }

	private:
		mt19937 _engine;
		uniform_real_distribution&lt;double&gt; _distribution;

};
#endif
</code></pre>
<pre><code class="language-cpp">#include &lt;iostream&gt;

#include &quot;rng.h&quot;

int main()
{
	int const threads = 8;

	omp_set_num_threads( threads );

	#pragma omp parallel
	{
		RNG rng( omp_get_thread_num() );

		#pragma omp critical
		{
			cout	&lt;&lt; &quot;random number from thread &quot;
						&lt;&lt; omp_get_thread_num()	&lt;&lt;	&quot;: &quot;	&lt;&lt; rng()
						&lt;&lt; endl;
		}
	}

	cout &lt;&lt; &quot;\nNext sequence!\n&quot; &lt;&lt; endl;

	#pragma omp parallel
	{
		RNG rng( omp_get_thread_num() );

		#pragma omp critical
		{
			cout	&lt;&lt; &quot;random number from thread &quot;
						&lt;&lt; omp_get_thread_num()	&lt;&lt;	&quot;: &quot;	&lt;&lt; rng()
						&lt;&lt; endl;
		}
	}

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2399133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399133</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Wed, 14 May 2014 11:47:58 GMT</pubDate></item><item><title><![CDATA[Reply to OpenMP und C++11 Zufallszahlengenerator on Wed, 14 May 2014 12:01:36 GMT]]></title><description><![CDATA[<p>Klaus82 schrieb:</p>
<blockquote>
<p>ich gebe jedem Thread einen eigenen (neu entworfenen) Zufallszahlengenerator. Jetzt habe ich aber nach wie vor das Problem, dass die erste und zweite Sequenz dieselben Zufallszahlen liefern.</p>
</blockquote>
<p>Verwende unterschiedliche Seeds, z.B. von <code>std::random_device</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399137</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 14 May 2014 12:01:36 GMT</pubDate></item><item><title><![CDATA[Reply to OpenMP und C++11 Zufallszahlengenerator on Wed, 14 May 2014 12:09:26 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Klaus82 schrieb:</p>
<blockquote>
<p>ich gebe jedem Thread einen eigenen (neu entworfenen) Zufallszahlengenerator. Jetzt habe ich aber nach wie vor das Problem, dass die erste und zweite Sequenz dieselben Zufallszahlen liefern.</p>
</blockquote>
<p>Verwende unterschiedliche Seeds, z.B. von <code>std::random_device</code> .</p>
</blockquote>
<p>Was es nicht alles gibt.</p>
<p>Na ja, am Ende würde ich damit genau das tun, was ich oben als quick and dirty bezeichnet habe: Der seed wird jedes Mal zufällig bestimmt. Was natürlich super für die Reproduzierbarkeit ist. <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>
<pre><code class="language-cpp">#ifndef RNG_H
#define RNG_H

#include &lt;iostream&gt;
#include &lt;random&gt;

#include &quot;omp.h&quot;

using namespace std;

class RNG
{
	public:
		RNG():
			_engine( _rd() ), _distribution( 0.0, 1.0 ){};

		double operator()(){ return _distribution( _engine ); }

	private:
		random_device _rd;
		mt19937 _engine;
		uniform_real_distribution&lt;double&gt; _distribution;

};
#endif
</code></pre>
<p>Gruß,<br />
-- Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399139</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Wed, 14 May 2014 12:09:26 GMT</pubDate></item><item><title><![CDATA[Reply to OpenMP und C++11 Zufallszahlengenerator on Wed, 14 May 2014 12:27:40 GMT]]></title><description><![CDATA[<p>Du erzeugst deine RNGs in jedem parallel-Block aufs neue, und das mit den selben Seeds. Klar, daß immer wieder dieselben Sequenzen herauskommen. Außerdem ist der Mersenne-Twister m.W. nicht gerade billig zu konstruieren.</p>
<p>Wie wär's mit einem übergeordneten vector&lt;RNG&gt; mit <em>threads</em> RNGs, auf die Du dann mit <code>rng_vec[omp_get_thread_num()]()</code> zugreifst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399142</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Wed, 14 May 2014 12:27:40 GMT</pubDate></item><item><title><![CDATA[Reply to OpenMP und C++11 Zufallszahlengenerator on Wed, 14 May 2014 12:25:59 GMT]]></title><description><![CDATA[<p>Caligulaminus schrieb:</p>
<blockquote>
<p>Wie wär's mit einem übergeordneten vector&lt;RNG&gt; mit <em>threads</em> RNGs, Auf die Du dann mit <code>rng_vec[omp_get_thread_num()]()</code> zugreifst?</p>
</blockquote>
<p>Du meinst so wie in meinem Startpost wofür ich schon abgewatscht wurde? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Gruß,<br />
-- Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399145</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Wed, 14 May 2014 12:25:59 GMT</pubDate></item><item><title><![CDATA[Reply to OpenMP und C++11 Zufallszahlengenerator on Wed, 14 May 2014 12:30:20 GMT]]></title><description><![CDATA[<p>In deinem Startpost war RNG von OMP abhängig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399146</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Wed, 14 May 2014 12:30:20 GMT</pubDate></item><item><title><![CDATA[Reply to OpenMP und C++11 Zufallszahlengenerator on Wed, 14 May 2014 12:33:20 GMT]]></title><description><![CDATA[<p>Caligulaminus schrieb:</p>
<blockquote>
<p>In deinem Startpost war RNG von OMP abhängig.</p>
</blockquote>
<p>Ja.</p>
<p>Aber ist das jetzt nicht eine konzeptionelle Frage? Ob ich einen Vektor von RNGs habe oder einen wrapper (genannt RNG) um einen Vektor von Generatoren lege?</p>
<p>Das macht doch nicht viel Unterschied?</p>
<p>Gruß,<br />
-- Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399147</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399147</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Wed, 14 May 2014 12:33:20 GMT</pubDate></item><item><title><![CDATA[Reply to OpenMP und C++11 Zufallszahlengenerator on Wed, 14 May 2014 12:38:14 GMT]]></title><description><![CDATA[<p>Klaus82 schrieb:</p>
<blockquote>
<p>Was natürlich super für die Reproduzierbarkeit ist. <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>
</blockquote>
<p>Wenn du reproduzierbare Zufallszahlen willst, dann nimm eben zuvor festgelegte Seeds. Naheliegend, oder? <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>
<p>P.S. Ich würde nicht jedes Mal auf den Vektor zugreifen. Übergib jedem Thread seinen eigenen, <strong>unabhängigen</strong> RNG, nachdem er entsprechend geseedet wurde. Gerade in Multithreaded-Szenarien würde alles so modular wie möglich halten und nur über sehr kleine Schnittstellen miteinander kommunizieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399148</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 14 May 2014 12:38:14 GMT</pubDate></item><item><title><![CDATA[Reply to OpenMP und C++11 Zufallszahlengenerator on Wed, 14 May 2014 12:42:56 GMT]]></title><description><![CDATA[<p>Ja, ja ... danke für die ganzen Vorschläge.</p>
<p>[piensen]<br />
Ich befürchte nur, dass es am Ende sowieso niemanden interessiert, wie penibel ich darauf achte. D.h. ich kann eigentlich auch direkt jedes Mal mit <code>std::random_device</code> seeden. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /><br />
[/piensen]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399152</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Wed, 14 May 2014 12:42:56 GMT</pubDate></item><item><title><![CDATA[Reply to OpenMP und C++11 Zufallszahlengenerator on Wed, 14 May 2014 17:04:23 GMT]]></title><description><![CDATA[<p>So,</p>
<p>ich habe jetzt eine große <code>#pragma omp parallel</code> Umgebung, auf dass jeder Thread seinen eigenen Kram macht und jeder vorkommende PRNG wird mittels <code>std::random_device</code> initialisiert.</p>
<p>Ist die mathematisch schändlichste Lösung, aber dafür die praktikabelste. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Gruß,<br />
-- Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399186</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Wed, 14 May 2014 17:04:23 GMT</pubDate></item><item><title><![CDATA[Reply to OpenMP und C++11 Zufallszahlengenerator on Wed, 14 May 2014 17:52:12 GMT]]></title><description><![CDATA[<p>Klaus82 schrieb:</p>
<blockquote>
<p>Ist die mathematisch schändlichste Lösung, aber dafür die praktikabelste. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
</blockquote>
<p>Schändlich ist das nur, wenn es nicht das ist, was du möchtest. Wenn es nicht das ist, was du möchtest, warum machst du es dann so?</p>
<p>Wenn du auf die Reproduzierbarkeit anspielst: Erstens ist es ja wohl einfach, sich dafür eine Lösung zu denken, zweitens hat Nexus diese bereits ausdrücklich erklärt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399190</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399190</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 14 May 2014 17:52:12 GMT</pubDate></item><item><title><![CDATA[Reply to OpenMP und C++11 Zufallszahlengenerator on Mon, 19 May 2014 14:26:09 GMT]]></title><description><![CDATA[<p>Sorry für die späte Rückmeldung.</p>
<p>Ich habe tatsächlich nochmal den <a href="http://stackoverflow.com/questions/15918758/how-to-make-each-thread-use-its-own-rng-in-c11" rel="nofollow">Eintrag bei Stackoverflow</a> gefunden, wo die Generatoren im Vektor gespeichert werden und jeder Thread auf einen Eintrag zugreift - so wie ich es im Startpost geschrieben hatte.</p>
<p>Also scheint das doch 'okay' zu sein, oder nicht?</p>
<p>Gruß,<br />
-- Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399899</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Mon, 19 May 2014 14:26:09 GMT</pubDate></item></channel></rss>