Software generador de números aleatorios estadísticamente perfecto
El problema de crear tales programas fue ampliamente discutido en la literatura matemática en 1965-1975, al mismo tiempo que se notó la complejidad de este problema.
Las matemáticas modernas han logrado avances significativos en este tema.
Son accesibles para especialistas limitados, pero difíciles de entender y se han eliminado de la discusión generalizada.
Ofrezco aquí una solución simple a este problema, puede que no sea digno de la atención de los grandes matemáticos, pero es bastante accesible para los principiantes.
He podido crear un programa que genera una secuencia de caracteres '0' y '1' con excelentes propiedades estadísticas.
El diseño del programa es simple y fácil de entender.
Una secuencia aleatoria de ceros y unos debe tener las siguientes propiedades:
- el número de ceros y unos en todos los fragmentos de esta secuencia es aproximadamente el mismo;
- el número de apariciones de los fragmentos 00, 01, 10 y 11 es siempre aproximadamente el mismo;
- lo mismo se aplica a todo tipo de fragmentos de longitud 3, 4, 5, etc.
Está claro que el programa puede contar el número de apariciones de tales fragmentos en la secuencia ya formada y generar el siguiente símbolo para respaldar las igualdades enumeradas.
Si analiza estas igualdades en orden ascendente de la longitud del fragmento, el programa se repetirá rápidamente.
, , .
?
'0' '1' ( ), , .
, .
, ( lenmask).
, lenmask .
.
s0 s1, .
s0 s1 , s0>s1 1, 0 .
s0 s1 , , 0 1 .
, , .
, , , .
JAVA .
.
.
.
.
Se cuenta el número de apariciones de estas máscaras en la secuencia generada.
Como era de esperar, los resultados del control demuestran que el número de casos de este tipo depende de la longitud de la máscara y casi no depende de su llenado.
Es sorprendente que un programa tan elemental permita obtener un resultado que parecía inalcanzable por medios simples.
solicitud
Texto del programa 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