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