Statistisch perfekte Zufallszahlengenerator-Software
Das Problem der Erstellung solcher Programme wurde in der mathematischen Literatur zwischen 1965 und 1975 ausfĂŒhrlich diskutiert, wĂ€hrend gleichzeitig die KomplexitĂ€t dieses Problems festgestellt wurde.
Die moderne Mathematik hat in dieser Hinsicht bedeutende Fortschritte gemacht.
Sie sind engen Fachleuten zugÀnglich, aber schwer zu verstehen und wurden aus der breiten Diskussion entfernt.
Ich biete hier eine einfache Lösung fĂŒr dieses Problem an, die vielleicht nicht die Aufmerksamkeit groĂer Mathematiker verdient, aber fĂŒr AnfĂ€nger durchaus zugĂ€nglich ist.
Ich konnte ein Programm erstellen, das eine Folge von Zeichen '0' und '1' mit hervorragenden statistischen Eigenschaften generiert.
Das Design des Programms ist einfach und leicht zu verstehen.
Eine zufÀllige Folge von Nullen und Einsen muss die folgenden Eigenschaften haben:
- Die Anzahl der Nullen und Einsen in allen Fragmenten dieser Sequenz ist ungefÀhr gleich.
- die Anzahl der Vorkommen der Fragmente 00, 01, 10 und 11 ist immer ungefÀhr gleich;
- Gleiches gilt fĂŒr alle Arten von Fragmenten der LĂ€nge 3, 4, 5 usw.
Es ist klar, dass das Programm die Anzahl der Vorkommen solcher Fragmente in der bereits gebildeten Sequenz zĂ€hlen und das nĂ€chste Symbol erzeugen kann, um die aufgelisteten Gleichungen zu unterstĂŒtzen.
Wenn Sie diese Gleichungen in aufsteigender Reihenfolge der FragmentlÀnge analysieren, wird das Programm schnell wiederholt.
, , .
?
'0' '1' ( ), , .
, .
, ( lenmask).
, lenmask .
.
s0 s1, .
s0 s1 , s0>s1 1, 0 .
s0 s1 , , 0 1 .
, , .
, , , .
JAVA .
.
.
.
.
Die Anzahl der Vorkommen dieser Masken in der generierten Sequenz wird gezÀhlt.
Wie erwartet zeigen die Kontrollergebnisse, dass die Anzahl solcher Vorkommen von der LĂ€nge der Maske abhĂ€ngt und fast nicht von ihrer FĂŒllung abhĂ€ngt.
Es ist ĂŒberraschend, dass solch ein völlig elementares Programm es einem ermöglicht, ein Ergebnis zu erzielen, das mit einfachen Mitteln unerreichbar schien.
Anwendung
JAVA-Programmtext
//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