En raison de l'influence de certains facteurs incontrôlables, tels que la mémoire système, l'état de l'ordinateur, etc., le nombre d'exécutions dans la boucle while sera différent à chaque fois.
Probablement des centaines de fois. Cela conduit à des différences dans les résultats.
Notez que ce programme utilise de nombreuses variables statiques, c'est-à-dire que lorsque le thread suivant continue d'exécuter la même méthode d'exécution que le thread précédent, sa valeur initiale est la valeur après l'exécution du thread précédent, ce qui forme un effet papillon classique. Cette différence est amplifiée, conduisant à la génération finale de nombres aléatoires.
Dans ce programme, un total de 13 threads sont ouverts, et à chaque fois les valeurs de ces variables statiques sont poussées dans une direction chaotique.
Par conséquent, le degré de confusion du tableau final double[] bb augmente géométriquement.
Le bb[0] initial n'a qu'environ quelques centaines de valeurs possibles, et lorsqu'il s'agit de bb[3], il peut s'agir de l'une des 65 536 données.
Afin d'obtenir le caractère aléatoire, j'ai bouclé 13 fois, et on peut dire que bb[12] est presque absolument aléatoire.
Copiez le code comme suit :
/**
* Auteur : Yuanhonglong
* Date : 2014-1-9
*/
la classe publique MyRandom implémente Runnable{
privé statique int aléatoire ;
int statique privé f = 127 ;
private static int m=(int)Math.pow(2,16);
private static int[] r=getR();
int statique privé x=13 ;
@Outrepasser
public void run(){
pour(;!Thread.interrupted();){
f=((f/2)+r[f])%m;
aléatoire=r[f];
}
}
int statique privé[] getR(){
//Enregistrez les 65536 nombres 0-65536 dans r[] dans un certain ordre
int[] r=nouveau int[m];
r[0]=13849;
pour(int i=1;i<m;i++){
r[i]=((2053*r[i-1])+13849)%m;
}
int k=r[65535];
r[65535]=r[(f+1)%m];
r[(f+1)%m]=k;
retourner r ;
}
changement de vide statique privéR(int[] r,int f){
//Déplacer r[]
int[] r1=nouveau int[r.length];
System.arraycopy(r,0,r1,0,r.length);
pour(int i=0;i<r.length;i++){
r[i]=r1[(i+f)%m];
}
}
public statique double getRandom_0_1(){
double[] dd=nouveau double[13];
pour(int i=0;i<dd.length;i++){
Runnable runnable=new MyRandom();
Thread thread=nouveau Thread (exécutable);
thread.start();
essayer{
Thread.sleep(x+1);
}
catch (InterruptedException e) {
e.getMessage();
}
thread.interrupt();
double rr=(double)aléatoire/(double)m;
x=f%13 ;
changerR(r,11+(f/7));
jj[i]=rr;
si((i>0)&&(dd[i]==dd[i-1])){
changerR(r,13+(f/11));
//Empêcher l'impact des points fixes sur le programme. Lorsque les deux valeurs sont identiques, cela signifie que le programme est peut-être entré dans une impasse, c'est-à-dire un point fixe. Pour les questions sur les points fixes, vous. peut faire référence à la connaissance des fonctions en mathématiques avancées.
}
}
double ran=dd[12];
retour couru;
}
public static void main (String[] args){
doublers=getRandom_0_1();
System.out.println(rs);
}
}
MonRandom.java
Copiez le code comme suit :
/**
* Auteur : Yuanhonglong
* Date : 2014-1-9
*/
paquet mine.loop;
la classe publique MyRandom implémente Runnable{
privé statique int aléatoire ;
int statique privé f = 127 ;
private static int m=(int)Math.pow(2,16);
private static int[] r=getR();
int statique privé x=13 ;
@Outrepasser
public void run(){
pour(;!Thread.interrupted();){
f=((f/2)+r[f])%m;
aléatoire=r[f];
}
}
int statique privé[] getR(){
// Stocke les 65536 nombres 0-65536 dans r[] dans un certain ordre
int[] r=nouveau int[m];
r[0]=13849;
pour(int i=1;i<m;i++){
r[i]=((2053*r[i-1])+13849)%m;
}
int k=r[65535];
r[65535]=r[(f+1)%m];
r[(f+1)%m]=k;
retourner r ;
}
changement de vide statique privéR(int[] r,int f){
int[] r1=nouveau int[r.length];
System.arraycopy(r,0,r1,0,r.length);
pour(int i=0;i<r.length;i++){
r[i]=r1[(i+f)%m];
}
}
public statique double getRandom_0_1(){
double[] dd=nouveau double[13];
pour(int i=0;i<dd.length;i++){
Runnable runnable=new MyRandom();
Thread thread=nouveau Thread (exécutable);
thread.start();
essayer{
Thread.sleep(x+1);
}
catch (InterruptedException e) {
e.getMessage();
}
thread.interrupt();
double rr=(double)aléatoire/(double)m;
x=f%13 ;
changerR(r,11+(f/7));
jj[i]=rr;
si((i>0)&&(dd[i]==dd[i-1])){
changerR(r,13+(f/11));
// Empêche l'impact des points fixes sur le programme. Lorsque les deux valeurs sont identiques, cela signifie que le programme est peut-être entré dans une impasse, c'est-à-dire un point fixe. Pour les questions sur les points fixes, vous. peut faire référence à la connaissance des fonctions en mathématiques avancées.
}
}
double ran=dd[12];
retour couru;
}
public static void main (String[] args){
doublers=getRandom_0_1();
System.out.println(rs);
}
}