{"id":3504,"date":"2018-06-01T14:49:08","date_gmt":"2018-06-01T13:49:08","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=3504"},"modified":"2018-06-01T14:59:44","modified_gmt":"2018-06-01T13:59:44","slug":"c-guns-ein-paar-wurfel","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=3504","title":{"rendered":"C++ Guns: Ein Paar W\u00fcrfel"},"content":{"rendered":"<p>Ich m\u00f6chte zum Spa\u00df ein W\u00fcfelspiel programmieren. Dazu m\u00fcssen einzelne W\u00fcrfel implementiert werden. Doch was ist ein W\u00fcrfel eigentlich? Offensichtlich ein Zufallszahlengenerator z.B. std::minstd_rand. Aber ein W\u00fcrfel repr\u00e4sentiert auch eine Gleichverteilung Ganzer Zahlen im Bereich von z.B. 1 bis 6. Und ein W\u00fcrfel hat ein Status, seine Augenzahl. Die \u00e4ndert sich ja nicht, egal wie oft man einen W\u00fcrfel anschaut. Au\u00dfer der W\u00fcrfel wird neu geworfen, also gibt es eine roll() Funktion.<br \/>\nUnd, ganz wichtig: Ein W\u00fcrfel kann default initialisiert werden. Denn sobald ein W\u00fcrfel existiert, zeigt er seine Augenanzahl an. Diese ist nat\u00fcrlich zuf\u00e4llig, aber existiert immer.<\/p>\n<p>Zusammen mit meinem Generic Data Type Design Pattern sieht der Code etwas komisch aus, macht aber genau was er soll. Im Unterschied zu vorherigen Implementationen dieses Pattern \u00e4ndern ein W\u00fcrfel st\u00e4ndig seinen Zustand. Daher gibt es neben den einheitlichen const getter Funktionen z.B. number(), diesmal auch non-const setter, welcher aber als privat! deklariert sind. Denn nur der W\u00fcrfel selbst darf seinen Zustand \u00e4ndern.<\/p>\n<p>F\u00fcr mich wichtig ist, dass das Erstellen und Benutzen von W\u00fcrfel-Objekten einfach und intuitiv ist. Sobald ein W\u00fcrfel erstellt worden ist, ist er da und hat eine Zahl. Wenn der W\u00fcrfel neu geworfen wird, \u00e4ndert sich die Zahl. Ansonsten kann der W\u00fcrfel nichts. Und so ist es doch gut.<\/p>\n<p>Was mich noch richtig st\u00f6rt ist das seedn der Zufallgeneratoren. Jeder W\u00fcrfel IST EIN Zufallsgenerator. Also muss der Seed immer unterschiedlich sein. Die Zeit in Sekunden kann hierf\u00fcr nicht genommen werden, diese \u00c4ndert sich ja nur jede Sekunde. Daher wird noch auf einen realen Hardware Zufallsgenerator zugegriffen und der endg\u00fcltige Seed mit std::seed_seq erstellt. std::seed_seq selbst darf aber kein tempor\u00e4res Objekt sein, da der Zufallszahlengenerator beim initialisieren das std::seed_seq Objekt ver\u00e4ndern darf.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\ntemplate&lt;int N=6&gt;\r\nstruct Dice : std::tuple&lt;std::minstd_rand, std::uniform_int_distribution&lt;int&gt;, int&gt; {\r\n    Dice() {\r\n        \/\/ Dreck.\r\n        std::seed_seq seed{unsigned(42), std::random_device()(), unsigned(std::time(nullptr))};\r\n        gen() = std::minstd_rand(seed);\r\n        dis() = std::uniform_int_distribution&lt;int&gt;(1,N);\r\n        number() = dis()(gen());\r\n    }\r\n    \r\n    auto roll() {\r\n        number() = dis()(gen());\r\n        return number();\r\n    }\r\n    \r\n    auto number() const {\r\n        return std::get&lt;2&gt;(*this);\r\n    }\r\n    \r\nprivate:\r\n    auto&amp; gen() {\r\n        return std::get&lt;0&gt;(*this);\r\n    }\r\n    \r\n    auto&amp; dis() {\r\n        return std::get&lt;1&gt;(*this);\r\n    }\r\n    \r\n    auto&amp; number() {\r\n        return std::get&lt;2&gt;(*this);\r\n    }\r\n};\r\n\r\ntemplate&lt;int M&gt;\r\nstruct Dices : std::array&lt;Dice&lt;&gt;,M&gt; {\r\n    void rollAll() {\r\n        for(auto&amp; x : *this) {\r\n            x.roll();\r\n        }\r\n    }\r\n};\r\n\r\n\r\nint main(int argc, char *argv&#x5B;]) {\r\n    QCoreApplication a(argc, argv);\r\n    \r\n    Dices&lt;5&gt; dices;\r\n    \r\n    for(int i=0; i &lt; 3; ++i) {\r\n        for(const auto&amp; x : dices) {\r\n            std::cout &lt;&lt; x.number() &lt;&lt; &quot; &quot;;\r\n        }\r\n        std::cout &lt;&lt; &quot;\\n&quot;;\r\n        dices.rollAll();\r\n    }\r\n    return 0;\r\n}\r\n<\/pre>\n<blockquote><p>5 2 3 5 1<br \/>\n5 6 3 1 3<br \/>\n2 6 5 5 2 <\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Ich m\u00f6chte zum Spa\u00df ein W\u00fcfelspiel programmieren. Dazu m\u00fcssen einzelne W\u00fcrfel implementiert werden. Doch was ist ein W\u00fcrfel eigentlich? Offensichtlich ein Zufallszahlengenerator z.B. std::minstd_rand. Aber ein W\u00fcrfel repr\u00e4sentiert auch eine Gleichverteilung Ganzer Zahlen im Bereich von z.B. 1 bis 6. Und ein W\u00fcrfel hat ein Status, seine Augenzahl. Die \u00e4ndert sich ja nicht, egal wie [&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],"class_list":["post-3504","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-cpp"],"_links":{"self":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3504","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=3504"}],"version-history":[{"count":3,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3504\/revisions"}],"predecessor-version":[{"id":3507,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3504\/revisions\/3507"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3504"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3504"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3504"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}