Software generador de números aleatorios estadísticamente perfecto

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
      
      






All Articles