{"id":618,"date":"2019-11-21T23:52:44","date_gmt":"2019-11-21T21:52:44","guid":{"rendered":"https:\/\/moijari.com\/?p=618"},"modified":"2020-06-29T22:16:44","modified_gmt":"2020-06-29T20:16:44","slug":"kellosarjassa-olevat-satunnaiset-bitit","status":"publish","type":"post","link":"https:\/\/moijari.com\/?p=618","title":{"rendered":"Kellosarjassa olevat satunnaiset bitit"},"content":{"rendered":"<p>T\u00e4ss\u00e4 uusimmassa versiossa yritet\u00e4\u00e4n laskea paremmin kellosarjasta tulevia satunnaisbittej\u00e4. Ohjelmassa lasketaan satunnaisbittej\u00e4 nelj\u00e4ll\u00e4 eri tavalla. Ensimm\u00e4isess\u00e4 tavassa (muuttuja b) lasketaan kellosarjojen pituuksia, eli sit\u00e4 kuinka monta kertaa per\u00e4kk\u00e4in sama numero ilmenee. T\u00e4m\u00e4 tapa on ollut mukana alusta asti. Toinen tapa on periaatteessa sama, aina kun kellosarjan numero vaihtuu, lis\u00e4t\u00e4\u00e4n teoreettiseen satunnaisuuteen yksi bitti (muuttuja rndbits). Kolmannessa tavassa lis\u00e4t\u00e4\u00e4n satunnaisuuteen yksi bitti aina kun kellosarjan pituus vaihtuu (muuttuja rndbits2). Nelj\u00e4nness\u00e4 tavassa (rndbits3) tarkastellaan viitt\u00e4 erilaista edellist\u00e4 kellosarjan pituutta, ja aina kun tulee edellisist\u00e4 poikkeava kellosarjan pituus lis\u00e4t\u00e4\u00e4n satunnaisuutta yhden bitin verran.<\/p>\n<p>Kaikkien n\u00e4iden tapojen pit\u00e4\u00e4 toteutua eli laskennallisia satunnaisbittej\u00e4 jokaisella tavalla tulee olla enemm\u00e4n kun haluttuja satunnaisbittej\u00e4 puskurissa.<\/p>\n<p>Clockbytes ehto varmistaa ett\u00e4 kellomateriaalia k\u00e4sitell\u00e4\u00e4n ainakin 2 kiloa.<\/p>\n<p>Sen verran ovat palautetut satunnaisbitit parantuneet, ett\u00e4 ensimm\u00e4isiss\u00e4 testeiss\u00e4 dieharder ei huomannut yht\u00e4\u00e4n heikkoutta. Aiemmin niit\u00e4 oli pari kolme.<\/p>\n<pre class=\"western\">void ressu_genbytes(int size, unsigned char *buffer, int b) \/* (c) JariK 2013-2019 *\/\n{\n  int c, d, e, f, g,\n    byte, prevbyte,\n    chainbytes, prevchainbytes = -1,\n    clockbytes = 0,\n    rndbits = 0, rndbits2 = 0,<br \/>    rndbits3 = 0;\n  unsigned char oldchains[5] = { 0,0,0,0,0 };\n  \n  prevbyte=clockbyte();\n  chainbytes=1;\n  f=0;\n\n  for(c=0; c &lt; 8*b || clockbytes &lt; 2000 ||\n        rndbits &lt; 8*size ||\n        (rndbits2 &gt; 0 &amp;&amp; rndbits2 &lt; 8*size ) ||\n        (rndbits3 &gt; 0 &amp;&amp; rndbits3 &lt; 8*size); c++)\n  {\n    for(d=0; d&lt;size; d++) {\n      e = buffer[d];\n      e = ((e&amp;0x80)&gt;&gt;7) | ((e&amp;0x7f)&lt;&lt;1);\n      byte = clockbyte();\n      buffer[d] = e^byte;\n      if(prevbyte != byte) {\n        prevbyte = byte;\n        rndbits++;\n        if(prevchainbytes != chainbytes) {\n          prevchainbytes = chainbytes;\n          rndbits2++;\n          for(g = 0; g &lt; sizeof(oldchains); g++)\n          {\n            if(oldchains[g] == chainbytes)\n              break;\n          }\n          if(g == sizeof(oldchains)) {\n            rndbits3++;\n            g--;\n          }\n          while(g &gt; 0) {\n            oldchains[g] = oldchains[g-1];\n            g--;\n          }\n          oldchains[0] = chainbytes;\n        } \/\/ if(prevchainbytes\n        clockbytes+= chainbytes;\n        chainbytes = 0;\n      } \/\/ if(prevbyte\n      chainbytes++;\n    } \/\/ for(d\n    for(d=0; d&lt;size; d++) {\n      f = (f+buffer[d])%size;\n      e = buffer[d];\n      buffer[d] = buffer[f];\n      buffer[f] = e;\n    }\n  } \/\/ for(c\n}\n<\/pre>\n<p>T\u00e4ss\u00e4 viel\u00e4 rutiini alkuper\u00e4isen b:n laskentaan.<\/p>\n<pre class=\"western\">int ressu_calculate_b()\n{\n  int c,d,e,total,count,bytes;\n\n  total=0;\n  count=0;\n  d=clockbyte();\n  for(c=0;c&lt;4096;c++) {\n    bytes=1;\n    while((e=clockbyte())==d)\n      bytes++;\n    total+=bytes;\n    count++;\n    d=e;\n  }\n\n  return((int)((float)total\/count));\n}\n<\/pre>\n<p>Clockbyte l\u00f6ytyy aiemmasta postista.<\/p>\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>T\u00e4ss\u00e4 uusimmassa versiossa yritet\u00e4\u00e4n laskea paremmin kellosarjasta tulevia satunnaisbittej\u00e4. Ohjelmassa lasketaan satunnaisbittej\u00e4 nelj\u00e4ll\u00e4 eri tavalla. Ensimm\u00e4isess\u00e4 tavassa (muuttuja b) lasketaan kellosarjojen pituuksia, eli sit\u00e4 kuinka monta kertaa per\u00e4kk\u00e4in sama numero ilmenee. T\u00e4m\u00e4 tapa on ollut mukana alusta asti. Toinen tapa on periaatteessa sama, aina kun kellosarjan numero vaihtuu, lis\u00e4t\u00e4\u00e4n teoreettiseen satunnaisuuteen yksi bitti (muuttuja rndbits).&hellip; <a class=\"more-link\" href=\"https:\/\/moijari.com\/?p=618\">Continue reading <span class=\"screen-reader-text\">Kellosarjassa olevat satunnaiset bitit<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[6],"tags":[],"_links":{"self":[{"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts\/618"}],"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=618"}],"version-history":[{"count":7,"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts\/618\/revisions"}],"predecessor-version":[{"id":628,"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts\/618\/revisions\/628"}],"wp:attachment":[{"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=618"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=618"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=618"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}