{"id":3983,"date":"2019-01-07T20:18:20","date_gmt":"2019-01-07T19:18:20","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=3983"},"modified":"2019-01-07T20:21:47","modified_gmt":"2019-01-07T19:21:47","slug":"c-guns-prng","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=3983","title":{"rendered":"C++ Guns: PRNG"},"content":{"rendered":"<p>Parallel mit mehreren Zufallsgeneratoren zu arbeiten ist echt nicht einfach. Die Details verstecken sich im Verst\u00e4ndnis. <\/p>\n<p>Mit welchen Seed werden sie erstellt? Einfach die Zeit in Sekunden plus 1, 2 3, 4? Wir k\u00f6nnen das ja einfach mal ausprobieren.<br \/>\nDie ersten drei Zahlen von vier Generatoren:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nint main() {\r\n  for(int j=1; j &lt; 5; ++j) {  \r\n    cout &lt;&lt; &quot;\\nseed &quot; &lt;&lt; j &lt;&lt; &quot;\\n&quot;;\r\n    std::minstd_rand gen(j);\r\n\r\n    for(int i=0; i &lt; 3; i++) {\r\n      cout &lt;&lt; gen() &lt;&lt; &quot;\\n&quot;;\r\n    }\r\n  }\r\n}\r\n<\/pre>\n<blockquote><p>seed 1<br \/>\n48271<br \/>\n182605794<br \/>\n1291394886<\/p>\n<p>seed 2<br \/>\n96542<br \/>\n365211588<br \/>\n435306125<\/p>\n<p>seed 3<br \/>\n144813<br \/>\n547817382<br \/>\n1726701011<\/p>\n<p>seed 4<br \/>\n193084<br \/>\n730423176<br \/>\n870612250<\/p><\/blockquote>\n<p>Setzt man die Zahlen ins Verh\u00e4ltnis zueinander und plottet sie, kommt der AHA Effekt:<br \/>\n<a href=\"http:\/\/roboblog.fatal-fury.de\/wp-content\/uploads\/2019\/01\/PRNGparallelshit.png\" rel=\"attachment wp-att-3984\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/roboblog.fatal-fury.de\/wp-content\/uploads\/2019\/01\/PRNGparallelshit.png\" alt=\"PRNGparallelshit\" width=\"640\" height=\"384\" class=\"alignnone size-full wp-image-3984\" srcset=\"http:\/\/roboblog.fatal-fury.de\/wp-content\/uploads\/2019\/01\/PRNGparallelshit.png 640w, http:\/\/roboblog.fatal-fury.de\/wp-content\/uploads\/2019\/01\/PRNGparallelshit-300x180.png 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/a><\/p>\n<p>Ach was. Zumindest die zuerst gezogenen Zahlen stehen ja in einem festen Verh\u00e4ltnis. Das Verh\u00e4ltnis der dritten gezogene Zufallszahl ist zwar nicht mehr gleich, aber immer noch bei allen eine kleine Zahl. Na, wenn diese vier Generatoren nicht \"parallel\" laufen ;)<\/p>\n<p>Der C++ Standard antwortet uns mit <a href=\"https:\/\/en.cppreference.com\/w\/cpp\/numeric\/random\/seed_seq\">std::seed_seq<\/a><\/p>\n<blockquote><p>std::seed_seq consumes a sequence of integer-valued data and produces a requested number of unsigned integer values i, 0 ? i < 232\n, based on the consumed data. <strong>The produced values are distributed over the entire 32-bit range even if the consumed values are close.<\/strong><br \/>\n...<br \/>\nThe following algorithm is used (adapted from the initialization sequence of the Mersenne Twister generator by <a href=\"http:\/\/www.math.sci.hiroshima-u.ac.jp\/~m-mat\/MT\/emt.html\">Makoto Matsumoto and Takuji Nishimura<\/a>, incorporating the improvements made by <a href=\"http:\/\/www.math.sci.hiroshima-u.ac.jp\/~m-mat\/MT\/SFMT\/M062821.pdf\">Mutsuo Saito in 2007<\/a>)\n <\/p><\/blockquote>\n<p>Weiterf\u00fchrende Quellen<br \/>\nSehr interessant: <a href=\"https:\/\/nullprogram.com\/blog\/2017\/09\/21\/\">Finding the Best 64-bit Simulation PRNG<\/a><br \/>\n<a href=\"https:\/\/cstheory.stackexchange.com\/questions\/19815\/multiple-independent-random-number-streams\/41574#41574\">Multiple independent random number streams<\/a><br \/>\n<a href=\"http:\/\/www.math.sci.hiroshima-u.ac.jp\/~m-mat\/MT\/DC\/dc.html\">Dynamic Creation (DC) of Mersenne Twister generators.<\/a><br \/>\n<a href=\"http:\/\/sprng.org\/\">Scalable Parallel Random Number Generators Library <\/a><br \/>\n<a href=\"https:\/\/www.numbercrunch.de\/trng\/trng.pdf\">Tina\u2019s Random Number Generator Library<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Parallel mit mehreren Zufallsgeneratoren zu arbeiten ist echt nicht einfach. Die Details verstecken sich im Verst\u00e4ndnis. Mit welchen Seed werden sie erstellt? Einfach die Zeit in Sekunden plus 1, 2 3, 4? Wir k\u00f6nnen das ja einfach mal ausprobieren. Die ersten drei Zahlen von vier Generatoren: int main() { for(int j=1; j &lt; 5; ++j) [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[17,35],"class_list":["post-3983","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-cpp","tag-math"],"_links":{"self":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3983","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3983"}],"version-history":[{"count":8,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3983\/revisions"}],"predecessor-version":[{"id":3993,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3983\/revisions\/3993"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3983"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3983"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3983"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}