{"id":798,"date":"2020-06-15T15:07:39","date_gmt":"2020-06-15T13:07:39","guid":{"rendered":"https:\/\/moijari.com\/?p=798"},"modified":"2020-07-10T13:26:03","modified_gmt":"2020-07-10T11:26:03","slug":"uusi-versio-ressusta","status":"publish","type":"post","link":"https:\/\/moijari.com\/?p=798","title":{"rendered":"Uusi versio Ressu:sta (v 1.7)"},"content":{"rendered":"\n<p>T\u00e4ss\u00e4 viel\u00e4 uusi versio ressu generaattorista: uudessa versiossa ei ole en\u00e4\u00e4 aiempien versioiden b-muuttujaa eik\u00e4 siihen liittyv\u00e4\u00e4 laskentaa, eli ei tarvita erillist\u00e4 p\u00e4\u00e4ohjelmaa. Edellisess\u00e4 versiossa oli useampia tapoja laskea teoreettisia bittej\u00e4, niist\u00e4 on vain yksi j\u00e4ljell\u00e4.<\/p>\n\n\n\n<p>Ressufunktio muodostuu p\u00e4\u00e4luupista, jonka alla on kaksi pienemp\u00e4\u00e4 luuppia. P\u00e4\u00e4luuppi (for(c=) sanelee ett\u00e4 kaikki puskurin bitit pit\u00e4\u00e4 kiert\u00e4\u00e4 v\u00e4hint\u00e4\u00e4n kerran (c&lt;8), ett\u00e4 generaattori ei lopeta ennenkuin kaikki merkin bitit on k\u00e4sitelty (c%8!=0), eli generaattorin katkokohdassa on k\u00e4sitelty kaikki puskurin merkkien kahdeksan bitti\u00e4. Kellosta tulevia merkkej\u00e4 pit\u00e4\u00e4 k\u00e4sitell\u00e4 v\u00e4hint\u00e4\u00e4n 2000 kappaletta (clockbytes&lt;2000). Lis\u00e4ksi varmistetaan ett\u00e4 teoreettisia bittej\u00e4 on v\u00e4hint\u00e4\u00e4n yksi jokaiselle generoidulle bitille (rndbits &lt; 8*size).<\/p>\n\n\n\n<p>P\u00e4\u00e4luupin alla on kaksi aliluuppia, joista ensimm\u00e4inen j\u00e4rjestelee merkin bittej\u00e4 siten ett\u00e4 ylin bitti merkiss\u00e4 kierret\u00e4\u00e4n alimmaksi ja loput bitit siirret\u00e4\u00e4n yhden bitin verran ylemm\u00e4ksi. Lis\u00e4ksi bitteihin xor:ataan yksi merkki kellosarjaa. Vuorotellen kukin bitti siirtyy alimmaiseksi ja n\u00e4in kahdeksan kierroksen aikana k\u00e4yd\u00e4\u00e4n kaikki bitit l\u00e4pi. Ensimm\u00e4inen aliluuppi k\u00e4sittelee kaikki puskurin merkit yksi merkki kerrallaan.<\/p>\n\n\n\n<p>Lis\u00e4ksi ensimm\u00e4inen aliluuppi laskee teoreettisia satunnaisuusbittej\u00e4. Teoreettisten satunnaisbittien m\u00e4\u00e4r\u00e4\u00e4 (rndbits) lis\u00e4t\u00e4\u00e4n yhdell\u00e4 aina kun kellosarjasta tulleen merkin arvo muuttuu. Seuraavassa bittisarjassa on yksi teoreettinen bitti numeroille 46, 47, 48, 49, 4a, 4b, 4c, 4d, 4e ja 4f, eli yhteens\u00e4 10 teoreettista bitti\u00e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>4646464646464747474747474848484848484949494949494a4a4a4a4a4a4b4b4b4b4b4b4b4c4c4c4c4c4d4d4d4d4d4d4e4e4e4e4e4f4f4f4f4f4f<\/code><\/pre>\n\n\n\n<p>Satunnaisuus edellisess\u00e4 kellojonossa tulee siit\u00e4 ett\u00e4 eri merkkien lukum\u00e4\u00e4r\u00e4 vaihtelee, seuraavassa kunkin merkin m\u00e4\u00e4r\u00e4 kellojonossa: F muuttuja tekee sen, ett\u00e4 jos yksikin f:\u00e4\u00e4n lis\u00e4tt\u00e4v\u00e4 merkki muuttuu kaikki loppumerkit muuttuvat erilaisiksi. Voi muuten v\u00e4itt\u00e4\u00e4 ett\u00e4 seuraavan taulukon kuutosriveiss\u00e4 ei ole kovin paljon satunnaista, ett\u00e4 satunnaisuus tulee p\u00e4\u00e4asiassa 7 ja 5 pituuksisista riveist\u00e4, eli poikkeuksista s\u00e4\u00e4nt\u00f6\u00f6n.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>464646464646    6\n474747474747    6\n484848484848    6\n494949494949    6\n4a4a4a4a4a4a    6\n4b4b4b4b4b4b4b  7\n4c4c4c4c4c      5\n4d4d4d4d4d4d    6\n4e4e4e4e4e      5\n4f4f4f4f4f4f    6<\/code><\/pre>\n\n\n\n<p>Toinen aliluuppi k\u00e4y my\u00f6s kaikki merkit l\u00e4pi ja vaihtaa jokaisen merkin (muuttuja d) satunnaisen puskurin merkin kanssa (muuttuja f).<\/p>\n\n\n\n<p>T\u00e4ss\u00e4 varsinainen koodi p\u00e4\u00e4funktiolle.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void ressu_genbytes(int size,\n        unsigned char *buffer) \/* JariK 2020 v1.7 *\/\n{\n  int c, d, e, f,\n    byte, prevbyte,\n    clockbytes = 0, rndbits = 0;\n\n  prevbyte = clockbyte();\n  f = 0;\n\n  for(c=0; c &lt; 8 || c%8 != 0 ||\n      clockbytes &lt; 2000 ||\n      rndbits &lt; 8*size; c++) {\n    for(d=0; d &lt; size; d++) {\n      e = buffer&#91;d];\n      e = ((e &amp; 0x80) >> 7) |\n          ((e &amp; 0x7f) &lt;&lt; 1);\n      byte = clockbyte();\n      buffer&#91;d] = e ^ byte;\n      if(prevbyte != byte) {\n        prevbyte = byte;\n        rndbits++;\n      }\n      clockbytes++;\n    }\n    for(d=0; d &lt; size; d++) {\n      f = (f + buffer&#91;d]) % size;\n      e = buffer&#91;d];\n      buffer&#91;d] = buffer&#91;f];\n      buffer&#91;f] = e;\n    }\n  }\n}\n<\/code><\/pre>\n\n\n\n<p>T\u00e4ss\u00e4 viel\u00e4 k\u00e4ytetty kellonluku:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>unsigned char clockbyte() \/* JariK 2013-2020 *\/\n{\n  struct timeval tv;\n\n  gettimeofday(&amp;tv,NULL);\n\n  return(tv.tv_usec &amp; 0xff);\n}<\/code><\/pre>\n\n\n\n<p>Seuraavassa ohjelman apufunktiot.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#define RESSUCNT 128\n#define RESSU_CLEAR 2\n\nunsigned char ressu_bytes&#91;RESSUCNT];\nint ressu_byte = 999999999;\nint ressu_cnt = RESSUCNT;\n\nvoid ressu_init()\n{\n}\n\nint ressu_genbyte()\n{\n  if(ressu_byte>=ressu_cnt) {\n#ifdef RESSU_CLEAR\n    memset(ressu_bytes,0,ressu_cnt);\n#else\n    if(ressu_byte == 999999999)\n      memset(ressu_bytes, 0, ressu_cnt);\n#endif\n    ressu_genbytes(ressu_cnt,\n        ressu_bytes);\n    ressu_byte=0;\n  }\n  return(ressu_bytes&#91;ressu_byte++]);\n}\n\nvoid ressu_clear()\n{\n    memset(ressu_bytes, 0, ressu_cnt);\n    ressu_byte = 999999998;\n}\n\nint ressu_genbyte_limit(int limit)\n{\n  int c;\n\n  while((c = ressu_genbyte())>\n      (256 \/ limit) * limit);\n  return(c % limit);\n}\n\nint ressu_genshort()\n{\n  return(ressu_genbyte()|\n         ressu_genbyte() &lt;&lt; 8);\n}\n\nint ressu_genshort_limit(int limit)\n{\n  int c;\n\n  while((c = ressu_genshort())>\n      (65536 \/ limit) * limit);\n  return(c % limit);\n}\n\nint ressu_gen32bits()\n{\n  return(ressu_genbyte()|\n         ressu_genbyte() &lt;&lt; 8|\n         ressu_genbyte() &lt;&lt; 16|\n         ressu_genbyte() &lt;&lt; 24);\n}\n\nvoid ressu_genbuffer(int size, unsigned char *buffer)\n{\n  int c;\n\n  for(c = 0; c &lt; size; c++)\n    buffer&#91;c] ^= ressu_genbyte();\n}\n<\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>T\u00e4ss\u00e4 viel\u00e4 uusi versio ressu generaattorista: uudessa versiossa ei ole en\u00e4\u00e4 aiempien versioiden b-muuttujaa eik\u00e4 siihen liittyv\u00e4\u00e4 laskentaa, eli ei tarvita erillist\u00e4 p\u00e4\u00e4ohjelmaa. Edellisess\u00e4 versiossa oli useampia tapoja laskea teoreettisia bittej\u00e4, niist\u00e4 on vain yksi j\u00e4ljell\u00e4. Ressufunktio muodostuu p\u00e4\u00e4luupista, jonka alla on kaksi pienemp\u00e4\u00e4 luuppia. P\u00e4\u00e4luuppi (for(c=) sanelee ett\u00e4 kaikki puskurin bitit pit\u00e4\u00e4 kiert\u00e4\u00e4 v\u00e4hint\u00e4\u00e4n&hellip; <a class=\"more-link\" href=\"https:\/\/moijari.com\/?p=798\">Continue reading <span class=\"screen-reader-text\">Uusi versio Ressu:sta (v 1.7)<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[6,11],"tags":[],"_links":{"self":[{"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts\/798"}],"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=798"}],"version-history":[{"count":34,"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts\/798\/revisions"}],"predecessor-version":[{"id":960,"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts\/798\/revisions\/960"}],"wp:attachment":[{"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=798"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=798"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=798"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}