Debido a la influencia de algunos factores incontrolables, como la memoria del sistema, el estado de la computadora, etc., el número de ejecuciones en el ciclo while será diferente cada vez.
Probablemente cientos de veces. Esto conduce a diferencias en los resultados.
Tenga en cuenta que este programa utiliza muchas variables estáticas, es decir, cuando el siguiente hilo continúa ejecutando el mismo método de ejecución que el hilo anterior, su valor inicial es el valor después de la ejecución del hilo anterior. Esto forma un efecto mariposa clásico. Esta diferencia se amplifica, lo que lleva a la generación final de números aleatorios.
En este programa, se abren un total de 13 subprocesos, y cada vez los valores de esas variables estáticas se empujan en una dirección caótica.
Por lo tanto, el grado de confusión de la matriz final double[] bb aumenta geométricamente.
El bb[0] inicial sólo tiene unos pocos cientos de valores posibles, y cuando se trata de bb[3] puede ser cualquiera de los 65536 datos.
Para lograr aleatoriedad, hice un bucle 13 veces y se puede decir que bb [12] es casi absolutamente aleatorio.
Copie el código de código de la siguiente manera:
/**
* Autor:Yuanhonglong
* Fecha:2014-1-9
*/
la clase pública MyRandom implementa Runnable{
privado estático int aleatorio;
privado estático int f = 127;
privado estático int m=(int)Math.pow(2,16);
privado estático int[] r=getR();
privado estático int x=13;
@Anular
ejecución pública vacía(){
for(;!Thread.interrupted();){
f=((f/2)+r[f])%m;
aleatorio=r[f];
}
}
int estático privado [] getR(){
//Guarda los 65536 números 0-65536 en r[] en un orden determinado
int[] r=nuevo int[m];
r[0]=13849;
para(int i=1;i<m;i++){
r[i]=((2053*r[i-1])+13849)%m;
}
intk=r[65535];
r[65535]=r[(f+1)%m];
r[(f+1)%m]=k;
devolver r;
}
cambio de vacío estático privadoR(int[] r,int f){
//Mover r[]
int[] r1=nuevo int[r.longitud];
System.arraycopy(r,0,r1,0,r.longitud);
for(int i=0;i<r.length;i++){
r[i]=r1[(i+f)%m];
}
}
público estático doble getRandom_0_1(){
doble[] dd=nuevo doble[13];
for(int i=0;i<dd.length;i++){
Ejecutable ejecutable=new MyRandom();
Hilo hilo = nuevo hilo (ejecutable);
hilo.start();
intentar{
Hilo.dormir(x+1);
}
captura (Excepción interrumpida e) {
e.getMessage();
}
hilo.interrupt();
doble rr=(doble)aleatorio/(doble)m;
x=f%13;
cambioR(r,11+(f/7));
dd[i]=rr;
si((i>0)&&(dd[i]==dd[i-1])){
cambioR(r,13+(f/11));
// Evitar el impacto de los puntos fijos en el programa. Cuando los dos valores son iguales, significa que el programa puede haber entrado en un callejón sin salida, es decir, un punto fijo. Puede referirse al conocimiento de funciones en matemáticas avanzadas.
}
}
doble ejecución=dd[12];
el regreso corrió;
}
principal vacío estático público (String [] argumentos) {
doble rs=getRandom_0_1();
System.out.println(rs);
}
}
MiRandom.java
Copie el código de código de la siguiente manera:
/**
* Autor:Yuanhonglong
* Fecha:2014-1-9
*/
paquete mío.loop;
la clase pública MyRandom implementa Runnable{
privado estático int aleatorio;
privado estático int f = 127;
privado estático int m=(int)Math.pow(2,16);
privado estático int[] r=getR();
privado estático int x=13;
@Anular
ejecución pública vacía(){
for(;!Thread.interrupted();){
f=((f/2)+r[f])%m;
aleatorio=r[f];
}
}
int estático privado [] getR(){
// Almacena los 65536 números 0-65536 en r[] en un orden determinado
int[] r=nuevo int[m];
r[0]=13849;
para(int i=1;i<m;i++){
r[yo]=((2053*r[i-1])+13849)%m;
}
intk=r[65535];
r[65535]=r[(f+1)%m];
r[(f+1)%m]=k;
devolver r;
}
cambio de vacío estático privadoR(int[] r,int f){
int[] r1=nuevo int[r.longitud];
System.arraycopy(r,0,r1,0,r.longitud);
for(int i=0;i<r.length;i++){
r[i]=r1[(i+f)%m];
}
}
público estático doble getRandom_0_1(){
doble[] dd=nuevo doble[13];
for(int i=0;i<dd.length;i++){
Ejecutable ejecutable=new MyRandom();
Hilo hilo = nuevo hilo (ejecutable);
hilo.start();
intentar{
Hilo.dormir(x+1);
}
captura (Excepción interrumpida e) {
e.getMessage();
}
hilo.interrupt();
doble rr=(doble)aleatorio/(doble)m;
x=f%13;
cambioR(r,11+(f/7));
dd[i]=rr;
si((i>0)&&(dd[i]==dd[i-1])){
cambioR(r,13+(f/11));
// Evita el impacto de los puntos fijos en el programa. Cuando los dos valores son iguales, significa que el programa puede haber entrado en un callejón sin salida, es decir, un punto fijo. Puede referirse al conocimiento de funciones en matemáticas avanzadas.
}
}
doble ejecución=dd[12];
el regreso corrió;
}
principal vacío estático público (String [] argumentos) {
doble rs=getRandom_0_1();
System.out.println(rs);
}
}