{"id":596,"date":"2018-06-11T15:33:42","date_gmt":"2018-06-11T13:33:42","guid":{"rendered":"https:\/\/moijari.com\/?p=596"},"modified":"2019-11-22T01:51:35","modified_gmt":"2019-11-21T23:51:35","slug":"ressu-kokeilu","status":"publish","type":"post","link":"https:\/\/moijari.com\/?p=596","title":{"rendered":"Ressu kokeilu: satunnaisuuden levi\u00e4misen nopeuttaminen"},"content":{"rendered":"<p>Ressu kokeilu yritt\u00e4\u00e4 lis\u00e4t\u00e4 satunnaisuuden muodostamista siirt\u00e4m\u00e4ll\u00e4 kellojonon luvun j\u00e4lkeen alimmasta eli &#8220;tarkimmasta&#8221; bitist\u00e4 satunnaisuutta seuraavien merkkien ylempiin bitteihin. Se ei tietenk\u00e4\u00e4n pysty lis\u00e4\u00e4m\u00e4\u00e4n satunnaisuutta kelloon mutta se nopeuttaa satunnaisuuden levi\u00e4mist\u00e4 kaikkiin puskurin bitteihin.<\/p>\n<pre>\/*\r\n * Ressu\u2212satunnaislukugeneraattori versio 1.0 (ressugen.c)\r\n *\r\n * (c)2013\u22122018 Jari Kuivaniemi, Kaikki oikeudet pid\u00e4tet\u00e4\u00e4n!\r\n *\/\r\n#include &lt;stdio.h&gt;\r\n#include &lt;sys\/time.h&gt;\r\n\r\nunsigned char *ressu_name = \"Ressu 1.0\";\r\n\r\n#ifndef OWN_CLOCK\r\n\r\nunsigned char clockbyte() \/* JariK 2013 *\/\r\n{\r\n  struct timeval tv;\r\n\r\n  gettimeofday(&amp;tv,NULL);\r\n\r\n  return(tv.tv_usec &amp; 0xff);\r\n}\r\n\r\n#endif\r\n\r\nvoid ressu_genbytes(int size, unsigned char *buffer, int b) \/* JariK 2013 *\/\r\n{\r\n  int c,d,e,f;\r\n\r\n  f=0;\r\n  for(c=0;c&lt;8*b;c++) {\r\n    for(d=0;d&lt;size;d++) {\r\n      e=buffer[d];\r\n      e=((e&amp;0x80)&gt;&gt;7) | ((e&amp;0x7f)&lt;&lt;1);\r\n      buffer[d]=e^clockbyte();\r\n    }\r\n    for(d=0;d&lt;size;d++) {\r\n      e=buffer[d]&amp;1;\r\n      buffer[(d+1)%size]^=(e&lt;&lt;1);\r\n      buffer[(d+2)%size]^=(e&lt;&lt;2);\r\n      buffer[(d+3)%size]^=(e&lt;&lt;3);\r\n      buffer[(d+4)%size]^=(e&lt;&lt;4);\r\n      buffer[(d+5)%size]^=(e&lt;&lt;5);\r\n      buffer[(d+6)%size]^=(e&lt;&lt;6);\r\n      buffer[(d+7)%size]^=(e&lt;&lt;7);\r\n    }\r\n    for(d=0;d&lt;size;d++) {\r\n      f=(f+buffer[d])%size;\r\n      e=buffer[d];\r\n      buffer[d]=buffer[f];\r\n      buffer[f]=e;\r\n    }\r\n  }\r\n}\r\n\r\n<\/pre>\n<p>Uusi kappale koodissa on tuo toinen &#8220;for(d=0;&#8221;\u00a0 -kappale. For d-toistorakenne k\u00e4y koko puskurin l\u00e4pi ja xor:aa sarjan alimman bitin seuraavan merkin toiseksi alimpaan merkkiin, kolmannen merkin kolmenneksi alimpaan bittiin, nelj\u00e4nnen merkin nelj\u00e4nneksi alimpaan bittiin jne. T\u00e4t\u00e4 toistetaan kunnes ensinn\u00e4kin t\u00e4m\u00e4n hetkisen sarjan kahdeksan merkki\u00e4 on k\u00e4sitelty ja toisaalta kunnes kaikki puskurin\u00a0 alimmat bitit on k\u00e4sitelty.<\/p>\n<p>Seuraa kierrosrakenne, joka vaihtaa korttipakkamaisesti kaikki puskurin merkit toiseen satunnaiseen merkkiin (f). T\u00e4m\u00e4n j\u00e4lkeen edelliset bitit eiv\u00e4t en\u00e4\u00e4 ole vierekk\u00e4in vaan ne siirtyv\u00e4t satunnaisiin kohtiin puskuria.<\/p>\n<p>Jos haluat katsella bittien vaihteluha, kopioi seuraava tulostusluuppi uuden kierrosrakenteen ensimm\u00e4iseksi ja viimeiseksi.<\/p>\n<pre>fprintf(stdout,\"\\n%2d %3d\",c,d);\r\nfor(g=0;g&lt;8;g++) {\r\n  fprintf(stdout,\" %02x\",buffer[d+g]);\r\n}<\/pre>\n<p>JK: Toinen tapa nopeuttaa satunnaisuuden siirtymist\u00e4 koko puskuriin on lis\u00e4t\u00e4 jokaiseen merkkiin satunnaisuutta seuraavista merkeist\u00e4: Ensimm\u00e4isess\u00e4 luupissa sarjan ensimm\u00e4ist\u00e4 merkki\u00e4 muutetaan toisen, kolmannen ja nelj\u00e4nnen merkkien perusteella. T\u00e4ss\u00e4 satunnaisuus saadaan kahden merkin and:in perusteella. Ensimm\u00e4inen pari on toinen ja kolmas\u00a0 merkki, toisen parin muodostavat toinen ja nelj\u00e4s merkki, kolmannen parin muodostavat kolmas ja nelj\u00e4s merkki.\u00a0 Parin puoliskot and:ataan kesken\u00e4\u00e4n ja n\u00e4ill\u00e4 kolmella merkill\u00e4 xor:ataan ensimm\u00e4ist\u00e4 merkki\u00e4. T\u00e4m\u00e4n j\u00e4lkeen voidaan ajaa taas &#8220;korttipakan sekoitus&#8221;, jolloin bitit jotka vaikuttavat toisiinsa eiv\u00e4t ole en\u00e4\u00e4 vierekk\u00e4in. Toisaalta t\u00e4ss\u00e4h\u00e4n k\u00e4yd\u00e4\u00e4n koko puskuri l\u00e4pi merkki kerrallaan, joten seuraavat merkit ilman korttipaikan sekoitustakin &#8220;h\u00e4vi\u00e4v\u00e4t&#8221;.<\/p>\n<pre>for(d=0;d&lt;size;d++) { \/\/ see sha2\r\n  buffer[d%size]^=\r\n    ((buffer[(d+1)%size]&amp;(buffer[(d+2)%size])) ^\r\n     (buffer[(d+1)%size]&amp;(buffer[(d+3)%size])) ^\r\n     (buffer[(d+2)%size]&amp;(buffer[(d+3)%size])) );\r\n}\r\n<\/pre>\n<p>Toinen versio on samanlainen mutta t\u00e4ss\u00e4 k\u00e4ytet\u00e4\u00e4n or:ia<\/p>\n<pre>for(d=0;d&lt;size;d++) {\r\n  buffer[d%size]^=\r\n    ((buffer[(d+1)%size]|(buffer[(d+2)%size])) ^\r\n     (buffer[(d+1)%size]|(buffer[(d+3)%size])) ^\r\n     (buffer[(d+2)%size]|(buffer[(d+3)%size])) );\r\n}\r\n<\/pre>\n<p>Kolmannessa k\u00e4ytet\u00e4\u00e4n satunnaisbittien hakemiseen ynn\u00e4yst\u00e4 ja satunnaisbittien yhteenlaskussa viel\u00e4kin xor:ia.<\/p>\n<pre>for(d=0;d&lt;size;d++) {\r\n  buffer[d%size]^=\r\n    (unsigned char)(\r\n    (buffer[(d+1)%size]+(buffer[(d+2)%size])) ^\r\n      (buffer[(d+1)%size]+(buffer[(d+3)%size])) ^\r\n    (buffer[(d+2)%size]+(buffer[(d+3)%size])) );\r\n}\r\n<\/pre>\n<p>Olen n\u00e4k\u00f6j\u00e4\u00e4n juuttunut t\u00e4h\u00e4n ressuun, toivottavasti saan aikaiseksi jotain muuta sanottavaa tertusta seuraavaan postiin.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ressu kokeilu yritt\u00e4\u00e4 lis\u00e4t\u00e4 satunnaisuuden muodostamista siirt\u00e4m\u00e4ll\u00e4 kellojonon luvun j\u00e4lkeen alimmasta eli &#8220;tarkimmasta&#8221; bitist\u00e4 satunnaisuutta seuraavien merkkien ylempiin bitteihin. Se ei tietenk\u00e4\u00e4n pysty lis\u00e4\u00e4m\u00e4\u00e4n satunnaisuutta kelloon mutta se nopeuttaa satunnaisuuden levi\u00e4mist\u00e4 kaikkiin puskurin bitteihin. \/* * Ressu\u2212satunnaislukugeneraattori versio 1.0 (ressugen.c) * * (c)2013\u22122018 Jari Kuivaniemi, Kaikki oikeudet pid\u00e4tet\u00e4\u00e4n! *\/ #include &lt;stdio.h&gt; #include &lt;sys\/time.h&gt; unsigned char&hellip; <a class=\"more-link\" href=\"https:\/\/moijari.com\/?p=596\">Continue reading <span class=\"screen-reader-text\">Ressu kokeilu: satunnaisuuden levi\u00e4misen nopeuttaminen<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[6],"tags":[],"_links":{"self":[{"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts\/596"}],"collection":[{"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=596"}],"version-history":[{"count":18,"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts\/596\/revisions"}],"predecessor-version":[{"id":615,"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts\/596\/revisions\/615"}],"wp:attachment":[{"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=596"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=596"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}