Logiciel générateur de nombres aléatoires statistiquement parfait

Logiciel générateur de nombres aléatoires statistiquement parfait



Le problème de la création de tels programmes a été largement discuté dans la littérature mathématique en 1965-1975, en même temps que la complexité de ce problème a été notée.







Les mathématiques modernes ont fait des progrès significatifs dans ce domaine.







Ils sont accessibles à des spécialistes restreints, mais difficiles à comprendre et ont été retirés de la discussion généralisée.







J'offre ici une solution simple à ce problème, elle ne mérite peut-être pas l'attention des grands mathématiciens, mais elle est tout à fait accessible aux débutants.







J'ai pu créer un programme qui génère une séquence de caractères «0» et «1» avec d'excellentes propriétés statistiques.







La conception du programme est simple et facile à comprendre.







Une séquence aléatoire de zéros et de uns doit avoir les propriétés suivantes:







  • le nombre de zéros et de uns dans tous les fragments de cette séquence est approximativement le même;
  • le nombre d'occurrences des fragments 00, 01, 10 et 11 est toujours approximativement le même;
  • il en va de même pour toutes sortes de fragments de longueur 3, 4, 5, etc.

    Il est clair que le programme peut compter le nombre d'occurrences de tels fragments dans la séquence déjà formée et générer le symbole suivant de manière à prendre en charge les égalités listées.


Si vous analysez ces égalités dans l'ordre croissant de la longueur du fragment, le programme va rapidement boucler.







, , .







?







'0' '1' ( ), , .







, .

, ( lenmask).







, lenmask .







.

s0 s1, .







s0 s1 , s0>s1 1, 0 .







s0 s1 , , 0 1 .







, , .







, , , .







JAVA .

.







.







.







.







Le nombre d'occurrences de ces masques dans la séquence générée est compté.

Comme prévu, les résultats du contrôle démontrent que le nombre de telles occurrences dépend de la longueur du masque et ne dépend presque pas de son remplissage.







Il est surprenant qu'un programme aussi élémentaire permette d'obtenir un résultat qui semblait inaccessible par des moyens simples.







application



Texte du programme 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