{"id":400,"date":"2016-03-06T23:59:13","date_gmt":"2016-03-06T21:59:13","guid":{"rendered":"https:\/\/moijari.com\/?p=400"},"modified":"2019-11-22T17:00:39","modified_gmt":"2019-11-22T15:00:39","slug":"satunnaislukugeneraattorin-uusi-kasittely-jatkuu","status":"publish","type":"post","link":"https:\/\/moijari.com\/?p=400","title":{"rendered":"Satunnaislukugeneraattorin uusi k\u00e4sittely (jatkuu)"},"content":{"rendered":"<p>Olen jonkin aikaa tutkinut t\u00e4t\u00e4 satunnaislukugeneraattoria: ja olen laatinut pari uutta ohjelmaa l\u00e4hinn\u00e4 kellosarjan jaksojen tutkimiseksi ja tuon b:n arvon m\u00e4\u00e4ritt\u00e4miseksi. Tertun tekemisess\u00e4 on ollut pieni luova tauko, mutta palaan siihen kyll\u00e4.. Kannattaa ehk\u00e4 lukaista edellinen posti: <a href=\"https:\/\/moijari.com\/?p=327\">https:\/\/moijari.com\/?p=327<\/a><\/p>\n<pre>\/*\r\n * (c)2013-2016 Jari Kuivaniemi, All rights reserved!\r\n *\/\r\nunsigned char clockbyte()\r\n{\r\n unsigned char byte;\r\n unsigned long usec,sec;\r\n\r\n struct timeval tv;\r\n\r\n gettimeofday(&amp;tv,NULL);\r\n\r\n usec=tv.tv_usec;\r\n sec=tv.tv_sec;\r\n\r\n byte=(usec&amp;0xff);\r\n\r\n return(byte);\r\n}\r\n\r\ngenbytes(int size, unsigned char *buffer, int b) \/* JariK ~2013*\/\r\n{\r\n\u00a0 int c,d,e,f;\r\n\u00a0 char byte;\r\n\r\n\u00a0 f=0;\r\n\u00a0 for(c=0;c&lt;8*b;c++) {\r\n\u00a0\u00a0\u00a0 for(d=0;d&lt;size;d++) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 byte=clockbyte();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 e=buffer[d];\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 e=((e&amp;0x80)&gt;&gt;7) | ((e&amp;0x7f)&lt;&lt;1);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 e=e^byte;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 buffer[d]=e;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 for(d=0;d&lt;size;d++) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 f=(f+buffer[d])%size;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 e=buffer[d];\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 buffer[d]=buffer[f];\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 buffer[f]=e;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0 }\r\n}<\/pre>\n<p>T\u00e4ll\u00e4 ensimm\u00e4isell\u00e4 ohjelmalla voidaan katsella kello sarjan jonojen pituuksia: (Kellon sarjathan tai variaatiot niiss\u00e4 antavat edelliselle generaattorille satunnaisuutta)<\/p>\n<pre>main()\r\n{\r\n\u00a0 int c,d,oldc,nextc,count,counts[1024];\r\n\u00a0 unsigned char buffer[BUFSIZE];\r\n\r\n\u00a0 for(c=0;c&lt;1024;c++)\r\n\u00a0\u00a0\u00a0 counts[c]=0;\r\n\r\n\u00a0 for(d=0;d&lt;BUFSIZE;d++)\r\n\u00a0\u00a0\u00a0 buffer[d]=clockbyte();\r\n\r\n\u00a0 oldc=-1;\r\n\r\n\u00a0 for(d=0;d&lt;BUFSIZE;d++) {\r\n\u00a0\u00a0\u00a0 if(oldc==-1) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 oldc=buffer[d];\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 count=1;\r\n\u00a0\u00a0\u00a0 } else if(buffer[d]!=oldc) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 counts[count]++;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 oldc=buffer[d];\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 count=1;\r\n\u00a0\u00a0\u00a0 } else if(buffer[d]==oldc) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 count++;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0 }\r\n\r\n\u00a0 for(c=0;c&lt;1024;c++) {\r\n\u00a0\u00a0\u00a0 if(counts[c]!=0)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stdout,\" %d(%d)\",counts[c],c);\r\n\u00a0 }\r\n\u00a0 fprintf(stdout,\"\\n\");\r\n\u00a0 fflush(stdout);\r\n}<\/pre>\n<p>Se tulostaa hitaalla koneella(raspberrypi) t\u00e4ll\u00e4isen rivin:<\/p>\n<pre>\u00a0431521(1) 308527(2)<\/pre>\n<p>Hiukan nopeammalla probookilla t\u00e4ll\u00e4isen:<\/p>\n<pre>\u00a0107(1) 101(2) 262(3) 2185(4) 9148(5) 23006(6) 122137(7)<\/pre>\n<p>Viel\u00e4 hiukan nopeammalla inuc:lla t\u00e4ll\u00e4isen:<\/p>\n<pre>\u00a012(1) 24(2) 22(3) 24(4) 23(5) 27(6) 13(7) 31(8) 22(9) 12(10) 21(11)\r\n 25(12) 23(13) 27(14) 28(15) 26(16) 21(17) 26(18) 24(19) 29(20)\r\n 26(21) 24(22) 22(23) 22(24) 22(25) 24(26) 25(27) 24(28) 12(29)\r\n 21(30) 18(31) 28(32) 29(33) 21(34) 33(35) 38(36) 38(37) 72(38)\r\n 118(39) 184(40) 495(41) 519(42) 1840(43) 736(44) 6856(45) 649(46)\r\n 29676(47) 3708(48)\r\n\r\n<\/pre>\n<p>Ensimm\u00e4inen luku on jonojen lukum\u00e4\u00e4r\u00e4 ja sulkeissa on jonon pituus, Eli Raspberry pi:ss\u00e4 jonot ovat 1 ja 2 pituisia, ja ett\u00e4 reilusti enemm\u00e4n jonoissa on kahden pituisia. Yleisin jono on siis 2 merkki\u00e4 pitk\u00e4.<\/p>\n<p>Probookin jonojen pituudet taas vaihtelevat yhden ja seitsem\u00e4n v\u00e4lill\u00e4, ja t\u00e4ss\u00e4kin pisint\u00e4 jonoa on eniten.<\/p>\n<p>Intel Nuc(3.10Ghz):ssa edelleen jonojen pituudet vaihtelevat 1 ja 48 v\u00e4lill\u00e4.<\/p>\n<p>Edelliset rivit olivat l\u00e4hinn\u00e4 yhteenvetoja kellon sarjoista, seuraavalla ohjelmalla on yritetty p\u00e4\u00e4tell\u00e4 pisimpien sarjojen pituuksia. (jos kello antaa pitki\u00e4 samoja merkkej\u00e4 sis\u00e4llt\u00e4vi\u00e4 sarjoja, se helpottaa huomattavasti kellon arvaamista)<\/p>\n<pre>main()\r\n{\r\n\u00a0 int c,first,lastbits,lastcount,countbits;\r\n\r\n\u00a0 for(c=0;c&lt;SIZE;c++) {\r\n\u00a0\u00a0\u00a0 buffer[c]=clockbyte();\r\n\u00a0 }\r\n\r\n\u00a0 lastbits=-1;\r\n\u00a0 lastcount=0;\r\n\u00a0 first=1;\r\n\r\n\u00a0 for(c=0;c&lt;SIZE;c++) {\r\n\u00a0\u00a0\u00a0 if(lastbits==-1) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 lastbits=buffer[c];\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 countbits=1;\r\n\u00a0\u00a0\u00a0 } else if(lastbits!=buffer[c]) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 if(!first) {\r\n\u00a0    \u00a0 \u00a0fprintf(stdout,\" \");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 if(countbits&lt;lastcount) {\r\n\u00a0\u00a0 \u00a0    fprintf(stdout,\"\\n\");\r\n\u00a0\u00a0 \u00a0    first=1;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stdout,\"%d\",countbits);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 first=0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 lastbits=buffer[c];\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 lastcount=countbits;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 countbits=1;\r\n\u00a0\u00a0\u00a0 } else if(lastbits==buffer[c]) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 countbits++;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0 }\r\n\u00a0 fprintf(stdout,\"\\n\");\r\n\u00a0 fflush(stdout);\r\n}\r\n\r\n<\/pre>\n<p>Molemmissa testiin p\u00e4\u00e4sseiss\u00e4 laitteissa on yleisin sarja melko pitk\u00e4. T\u00e4ss\u00e4 listassa tosin ainoastaan jonojen pituudet vaikuttavat mihin summaan jono tulee, eli noissa yleisimmiss\u00e4 sarjoissa merkkien arvot voivat olla erilaisia. Ohjelmaa on ajettu komennolla:<\/p>\n<pre>$ .\/rn9 | sort | uniq -cd | sort -gr | more<\/pre>\n<pre>Intel Nuc:\r\n\r\n1868891 47 47 47 47 47 47 47 47 48 \r\n 375860 47 47 47 47 47 47 47 48 \r\n 27043 39 \r\n 26097 38 \r\n 20677 47 47 47 47 47 47 47 47 47 48 \r\n 17652 40 \r\n 17511 37 \r\n 15733 47 \r\n 14121 41 42 42 \r\n 13790 47 47 \r\n 12311 41 42 \r\n 12194 47 47 47 \r\n 11962 41 \r\n 11570 47 47 47 47 \r\n 11155 47 47 47 47 47 \r\n 11071 38 40 \r\n 10748 47 47 47 47 47 47 \r\n 10465 38 39 \r\n 10386 39 40 \r\n 10350 42 \r\n 10301 36 \r\n 10081 47 47 47 47 47 47 47 \r\n 9613 45 \r\n 9462 37 39 \r\n 9148 43 \r\n 8713 45 46 46 46 46 46 \r\n 8583 45 47 \r\n 8056 47 47 47 47 47 47 47 47 \r\n 7304 37 40 \r\n 7147 37 38 \r\n 6830 45 46 46 46 46 46 46 \r\n 6437 39 39 \r\n 6229 45 48 \r\n 6002 38 41 \r\n\r\nHP Probook:\r\n\r\n16694408 7 7 7 7 7 7 8 \r\n4681171 7 7 7 7 7 8 \r\n\u00a0356835 5 6 \r\n\u00a0200135 7 7 7 7 7 7 7 7 7 8 \r\n\u00a0144738 7 7 7 7 7 7 7 8 \r\n\u00a0 83786 5 5 6 \r\n\u00a0 25575 7 7 7 7 7 7 7 7 7 7 8 \r\n\u00a0 20908 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 \r\n\u00a0 16492 7 \r\n\u00a0 16318 6 7 8 \r\n\u00a0 14668 6 8 \r\n\u00a0 13082 3 \r\n\u00a0\u00a0 9285 6 7 7 8 \r\n\u00a0\u00a0 7329 7 7 \r\n\u00a0\u00a0 7052 7 7 7 \r\n\u00a0\u00a0 6833 7 7 7 7 \r\n\u00a0\u00a0 6666 7 7 7 7 7 \r\n\u00a0\u00a0 6336 4 \r\n\u00a0\u00a0 5163 7 7 7 7 7 7 \r\n<\/pre>\n<p>T\u00e4m\u00e4nhetkinen p\u00e4\u00e4telm\u00e4ni on ett\u00e4 jos b:n arvo on niin korkea, ett\u00e4 genbytes() palauttaa aina uniikkeja arvoja(parhaimmillaan 2^(bits-1) uniikkia arvoa, kellosta saadaan riitt\u00e4v\u00e4n paljon satunnaisuutta. T\u00e4ss\u00e4 ohjelma, joka palauttaa listan ensimm\u00e4isist\u00e4 b:n arvoista jotka palauttavat uniikkeja arvoja. Niille voidaan tehd\u00e4 sitten pidempi jatkotarkastelu edellisen postin viimeisell\u00e4 ohjelmalla. (tarkoituksena olisi tietysti l\u00f6yt\u00e4\u00e4 kaava t\u00e4lle riitt\u00e4v\u00e4n suurelle b:n arvolle, nim\u00e4 ohjelmat ovat suhteellisen hitaita (kaavassa esimerkiksi b=?puskurin pituus, kellon jonojen pituus?).<\/p>\n<pre>struct list {\r\n\u00a0 struct list *next;\r\n\u00a0 char *string;\r\n};\r\n\r\nstruct list *first;\r\n\r\nchar *filename=\"test23.txt\";\r\nchar *procname=NULL;\r\nFILE *fpd;\r\n\r\nclearlist(struct list **l)\r\n{\r\n\u00a0 struct list *l1,*l2;\r\n\r\n\u00a0 l1=*l;\r\n\r\n\u00a0 while(l1!=NULL) {\r\n\u00a0\u00a0\u00a0 free(l1-&gt;string);\r\n\u00a0\u00a0\u00a0 l2=l1-&gt;next;\r\n\u00a0\u00a0\u00a0 free(l1);\r\n\u00a0\u00a0\u00a0 l1=l2;\r\n\u00a0 }\r\n\u00a0 *l=NULL;\r\n}\r\n\r\nint addstring(struct list **l, char *string)\r\n{\r\n\u00a0 struct list *l1,*ln,*llast;\r\n\r\n\u00a0 ln=malloc(sizeof(struct list));\r\n\u00a0 ln-&gt;next=NULL;\r\n\u00a0 ln-&gt;string=malloc(strlen(string)+1);\r\n\u00a0 strcpy(ln-&gt;string,string);\r\n\r\n\u00a0 l1=*l;\r\n\u00a0 if(l1==NULL) {\r\n\u00a0\u00a0\u00a0 *l=ln;\r\n\u00a0 } else {\r\n\u00a0\u00a0\u00a0 llast=NULL;\r\n\u00a0\u00a0\u00a0 while(l1!=NULL) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 llast=l1;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 l1=l1-&gt;next;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 if(llast!=NULL)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 llast-&gt;next=ln;\r\n\u00a0\u00a0\u00a0 else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 (*l)-&gt;next=ln;\r\n\u00a0 }\r\n}\r\n\r\nint findstring(struct list *l,char *string)\r\n{\r\n\u00a0 int ok;\r\n\r\n\u00a0 ok=1;\r\n\u00a0 while(l!=NULL) {\r\n\u00a0\u00a0\u00a0 if(!strcmp(l-&gt;string,string)) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 ok=0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 l=l-&gt;next;\r\n\u00a0 }\r\n\u00a0 return(ok);\r\n}\r\n\r\ndumpstrings(struct list *l)\r\n{\r\n\u00a0 while(l!=NULL) {\r\n\u00a0\u00a0\u00a0 fprintf(stdout,\"\\ndump: %s\",l-&gt;string);\r\n\u00a0\u00a0\u00a0 l=l-&gt;next;\r\n\u00a0 }\r\n}\r\n\r\nint dotest(int testsize, int b,int dumpsize,int testcount)\r\n{\r\n\u00a0 int c,e,alku,loppu,dup;\r\n\u00a0 char filename[128];\r\n\u00a0 unsigned char buffer[32768];\r\n\u00a0 unsigned char string[32768],cdigit[3];\r\n\u00a0 FILE *fp1;\r\n\u00a0 struct list *l;\r\n\r\n\u00a0 l=NULL;\r\n\r\n\u00a0 dup=0;\r\n\r\n\u00a0 alku=(int)time(NULL);\r\n\u00a0 for(c=0;c&lt;testcountmax*2;c++) { \/* tuo kakkonen kaipaa s\u00e4\u00e4t\u00e4mist\u00e4.. *\/\r\n\u00a0\u00a0\u00a0 memset(buffer,0,testsize);\r\n\u00a0\u00a0\u00a0 genbytes(testsize,buffer,b);\r\n\u00a0\u00a0\u00a0 string[0]='\\0';\r\n\u00a0\u00a0\u00a0 if(dumpsize&gt;testsize) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 for(e=0;e&lt;testsize;e++) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sprintf(cdigit,\"%02x\",buffer[e]);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 strcat(string,cdigit);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 } else {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 for(e=0;e&lt;dumpsize;e++) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sprintf(cdigit,\"%02x\",buffer[e]);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 strcat(string,cdigit);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 if(!findstring(l,string)) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 dup=1;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stdout,\", Duplicate\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 fflush(stdout);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0 } else {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 addstring(&amp;l,string);\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0 }\r\n\u00a0 }\r\n\u00a0 loppu=(int)time(NULL);\r\n\u00a0 fprintf(fpd,\"%d testsize, %d bytes per bit, %d total tries, %d testcountmax, %d total seconds, %f seconds per crypt, %d duplicate\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 testsize,b,c,testcountmax,loppu-alku,((double)((double)loppu-alku)\/testcount),dup);\r\n\u00a0 if(dup==0) {\r\n\u00a0 } else {\r\n    if(testcountmax&lt;c)\r\n\u00a0\u00a0\u00a0   testcountmax=c;\r\n  }\r\n\u00a0 fprintf(fpd,\"\\n\");\r\n\u00a0 fflush(fpd);\r\n\r\n\u00a0 clearlist(&amp;l);\r\n\u00a0 return(dup);\r\n}\r\n\r\n#define USE100 2\r\n#define USE50 2\r\n#define USE10 2\r\nmain(int argc,char *argv[])\r\n{\r\n  int c,b,last;\r\n\r\n  procname=argv[0];\r\n\r\n  testcountmax=1024*64;\r\n\r\n  if((fpd=fopen(filename,\"a\"))==NULL) {\r\n    fprintf(stdout,\"%s: cannot open file %s\\n\",procname,filename);\r\n  }\r\n\r\n  for(c=16;c&lt;=4096;c+=c) {\r\n    testcountmax=1024*32;\r\n    last=0;\r\n#ifdef USE100\r\n    for(b=last+1;b&lt;1024;b+=100) {\r\n      if(dotest(c,b,23,1048576*8)==0)\r\n        break;\r\n      last=b;\r\n    }\r\n#endif\r\n#ifdef USE50\r\n    for(b=last+1;b&lt;1024;b+=50) {\r\n      if(dotest(c,b,23,1048576*8)==0)\r\n        break;\r\n      last=b;\r\n    }\r\n#endif\r\n#ifdef USE10\r\n    for(b=last+1;b&lt;1024;b+=10) {\r\n      if(dotest(c,b,23,1048576*8)==0)\r\n        break;\r\n      last=b;\r\n    }\r\n#endif\r\n    for(b=last+1;b&lt;1024;b++) {\r\n      if(dotest(c,b,23,1048576*8)==0)\r\n        break;\r\n      last=b;\r\n    }\r\n    fprintf(stdout,\"%d testsize, %d bytes per bit\\n\",c,last);\r\n  }\r\n}<\/pre>\n<p>T\u00e4ss\u00e4 tuloste Probook laitteella:<\/p>\n<pre>16 testsize, 1 bytes per bit, 389 total tries, 32768 testcountmax, 0 total seconds, 0.000000 seconds per crypt, 1 duplicate\r\n16 testsize, 101 bytes per bit, 36442 total tries, 32768 testcountmax, 91 total seconds, 0.000011 seconds per crypt, 1 duplicate\r\n16 testsize, 201 bytes per bit, 72884 total tries, 36442 testcountmax, 370 total seconds, 0.000044 seconds per crypt, 0 duplicate\r\n16 testsize, 102 bytes per bit, 19587 total tries, 36442 testcountmax, 46 total seconds, 0.000005 seconds per crypt, 1 duplicate\r\n16 testsize, 152 bytes per bit, 72884 total tries, 36442 testcountmax, 295 total seconds, 0.000035 seconds per crypt, 0 duplicate\r\n16 testsize, 103 bytes per bit, 72811 total tries, 36442 testcountmax, 219 total seconds, 0.000026 seconds per crypt, 1 duplicate\r\n16 testsize, 113 bytes per bit, 28246 total tries, 72811 testcountmax, 75 total seconds, 0.000009 seconds per crypt, 1 duplicate\r\n16 testsize, 123 bytes per bit, 145622 total tries, 72811 testcountmax, 649 total seconds, 0.000077 seconds per crypt, 0 duplicate\r\n16 testsize, 114 bytes per bit, 145622 total tries, 72811 testcountmax, 630 total seconds, 0.000075 seconds per crypt, 0 duplicate\r\n\r\n<\/pre>\n<p>Ensimm\u00e4iset kierrokset kasvatetaan b:t\u00e4 sadalla. Kun ensimm\u00e4inen vain uniikkipuskureita sis\u00e4lt\u00e4v\u00e4 rivi tulee vastaan (b=201), peruutetaan viimeiseen duplikaatteja palauttaneeseen riviin(b=101), ja jatketaan 50 v\u00e4lein seuraavasta b:n arvosta. Samoin k\u00e4yd\u00e4\u00e4n l\u00e4\u00e4pi sek\u00e4 kkymmenet ja ykk\u00f6set. T\u00e4ss\u00e4 ensimm\u00e4inen potentiaalinen uniikkeja puskureita palauttava rivi on b:n arvolla 114.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Olen jonkin aikaa tutkinut t\u00e4t\u00e4 satunnaislukugeneraattoria: ja olen laatinut pari uutta ohjelmaa l\u00e4hinn\u00e4 kellosarjan jaksojen tutkimiseksi ja tuon b:n arvon m\u00e4\u00e4ritt\u00e4miseksi. Tertun tekemisess\u00e4 on ollut pieni luova tauko, mutta palaan siihen kyll\u00e4.. Kannattaa ehk\u00e4 lukaista edellinen posti: https:\/\/moijari.com\/?p=327 \/* * (c)2013-2016 Jari Kuivaniemi, All rights reserved! *\/ unsigned char clockbyte() { unsigned char byte; unsigned&hellip; <a class=\"more-link\" href=\"https:\/\/moijari.com\/?p=400\">Continue reading <span class=\"screen-reader-text\">Satunnaislukugeneraattorin uusi k\u00e4sittely (jatkuu)<\/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\/400"}],"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=400"}],"version-history":[{"count":16,"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts\/400\/revisions"}],"predecessor-version":[{"id":418,"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts\/400\/revisions\/418"}],"wp:attachment":[{"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=400"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=400"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=400"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}