統計的に完全な乱数ジェネレータソフトウェア
このようなプログラムを作成する問題は、1965年から1975年にかけて数学の文献で広く議論され、同時にこの問題の複雑さが指摘されました。
現代の数学はこの問題で大きな進歩を遂げました。
それらは狭い専門家にアクセス可能ですが、理解するのが難しく、広範な議論から削除されました。
私はここでこの問題の簡単な解決策を提供します。それは偉大な数学者の注目に値しないかもしれませんが、初心者にはかなりアクセス可能です。
優れた統計特性を持つ文字「0」と「1」のシーケンスを生成するプログラムを作成することができました。
プログラムのデザインはシンプルで理解しやすいです。
ゼロと1のランダムなシーケンスには、次のプロパティが必要です。
- このシーケンスのすべてのフラグメントの0と1の数はほぼ同じです。
- フラグメント00、01、10、および11の出現回数は常にほぼ同じです。
- 同じことが、長さ3、4、5などのすべての種類のフラグメントに当てはまります。
プログラムが、すでに形成されたシーケンス内のそのようなフラグメントの発生数をカウントし、リストされた等式をサポートするために次のシンボルを生成できることは明らかです。
これらの等式をフラグメント長の昇順で分析すると、プログラムはすぐにループします。
, , .
?
'0' '1' ( ), , .
, .
, ( lenmask).
, lenmask .
.
s0 s1, .
s0 s1 , s0>s1 1, 0 .
s0 s1 , , 0 1 .
, , .
, , , .
JAVA .
.
.
.
.
生成されたシーケンスでのこれらのマスクの発生数がカウントされます。
予想通り、制御結果は、そのような発生の数がマスクの長さに依存し、その充填にほとんど依存しないことを示しています。
そのような完全に初歩的なプログラムが、単純な手段では達成できないように思われる結果を得ることができるのは驚くべきことです。
応用
JAVAプログラムテキスト
//gerase = generator random sequence // // package ikojar; public class gerase { public static void main(String[] args) { // //, // beg // int beg=5, // lenrez=2048, //maxpower // // // // // // // // maxpower=10; // //rs random symbol, , // // , // , byte rs=0; // result // byte[] result=new byte[lenrez]; // mask , // , // // , // byte[] mask=new byte[lenrez]; // // beg // beg // result int p=beg,bp=0; for(;;) {//cir raspak result[bp]=(byte)(p%2); bp++; if(p<2)break; p/=2; }//cir raspak // String so=" "; for(int i=0;i<bp;i++)so+=String.valueOf(result[i]); System.out.println(so); // System.out.println(" "); // for(int pos=bp;pos<lenrez;pos++) {//circlepos // hs(hard symbol) // , // // , // rs int hs=0; // //lenmask for(int lenmask=pos-2;lenmask>=0;lenmask--) {//lenmask // // for(int i=0;i<lenmask;i++)mask[i]=result[pos+i-lenmask]; //s0 s1 // // // // int s0=0,s1=0; // // for(int i=lenmask;i<pos;i++) {//calcS01 //eqm // int eqm=1; // eqm for(int i1=0;i1<lenmask;i1++)if(mask[i1]!=result[i+i1-lenmask]){eqm=0;break;} // , // if(eqm==1)if(result[i]==0)s0++;else s1++; }//calcS01 // // s0 s1 // hs 1, // if(s0<s1){result[pos]=0;hs=1;break;} if(s1<s0){result[pos]=1;hs=1;break;} }//lenmask if(hs==1)continue; // , // rs result[pos]=rs;rs=(byte)(1-rs); }//circlepos // // so=""; for(int i=0,c=0;i<lenrez;i++) {//out rez so+=String.valueOf(result[i]); c++; if(c==64){c=0;System.out.println(so);so="";} }//out rez System.out.println(so); // System.out.println (" "); // //pw , // for(int pw=1;pw<maxpower;pw++) {//pw // // // // // // 0 pm-1 // pm int pm=1;for(int i=0;i<pw;i++)pm*=2; // , // System.out.println(" "+String.valueOf(pw)); int mincount=lenrez,maxcount=0; // 0 pm-1, // for(int im=0;im<pm;im++) {//im // im p=im; for(int i=pw-1;i>=0;i--) {mask[i]=(byte)(p%2);p/=2;} // // // s // int s=0; for(int i0=pw;i0<=lenrez;i0++) {//i0 // int eqm=1; for(int i1=0;i1<pw;i1++)if(result[i0+i1-pw]!=mask[i1]){eqm=0;break;} if(eqm==1)s++; }//i0 // // // //System.out.println(String.valueOf(s)); // if(s<mincount)mincount=s; if(s>maxcount)maxcount=s; }//im System.out.println(" ="+String.valueOf(mincount)); System.out.println(" ="+String.valueOf(maxcount)); }//pw return; }//main }//class