Devido à influência de alguns fatores incontroláveis, como memória do sistema, status do computador, etc., o número de execuções no loop while será diferente a cada vez.
Provavelmente centenas de vezes. Isso leva a diferenças nos resultados.
Observe que este programa usa muitas variáveis estáticas. Ou seja, quando o próximo thread continua a executar o mesmo método de execução do thread anterior, seu valor inicial é o valor após a execução do thread anterior. Essa diferença é amplificada, levando à geração final de números aleatórios.
Neste programa, um total de 13 threads são abertos, e cada vez os valores dessas variáveis estáticas são empurrados em uma direção caótica.
Portanto, o grau de confusão do array final double[] bb aumenta geometricamente.
O bb[0] inicial tem apenas algumas centenas de valores possíveis e, quando se trata de bb[3], pode ser qualquer um dos 65.536 dados.
Para obter aleatoriedade, fiz um loop 13 vezes e pode-se dizer que bb[12] é quase absolutamente aleatório.
Copie o código do código da seguinte forma:
/**
* Autor: Yuanhonglong
* Data: 9/1/2014
*/
classe pública MyRandom implementa Runnable{
privado estático int aleatório;
privado estático int f=127;
privado estático int m=(int)Math.pow(2,16);
private static int[] r=getR();
privado estático int x = 13;
@Substituir
execução nula pública(){
for(;!Thread.interrupted();){
f=((f/2)+r[f])%m;
aleatório=r[f];
}
}
privado estático int[] getR(){
//Salve os 65536 números 0-65536 em r[] em uma determinada ordem
int[] r=novo int[m];
r[0]=13849;
for(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;
retornar r;
}
private static void changeR(int[] r,int f){
//Mover r[]
int[] r1=novo int[r.comprimento];
System.arraycopy(r,0,r1,0,r.length);
for(int i=0;i<r.comprimento;i++){
r[i]=r1[(i+f)%m];
}
}
público estático duplo getRandom_0_1(){
duplo[] dd=novo duplo[13];
for(int i=0;i<dd.length;i++){
Executável executável=new MyRandom();
Thread thread=new Thread(executável);
thread.start();
tentar{
Thread.sleep(x+1);
}
catch(InterruptedException e){
e.getMessage();
}
thread.interrupt();
duplo rr=(duplo)aleatório/(duplo)m;
x=f%13;
mudarR(r,11+(f/7));
dd[i]=rr;
if((i>0)&&(dd[i]==dd[i-1])){
alterarR(r,13+(f/11));
//Evitar o impacto dos pontos fixos no programa Quando os dois valores são iguais, significa que o programa pode ter entrado em um beco sem saída, ou seja, um ponto fixo. pode se referir ao conhecimento de funções em matemática avançada.
}
}
corrida dupla=dd[12];
retorno executado;
}
public static void main(String[] args){
duplo rs=getRandom_0_1();
System.out.println(rs);
}
}
MeuRandom.java
Copie o código do código da seguinte forma:
/**
* Autor: Yuanhonglong
* Data: 9/1/2014
*/
pacote meu.loop;
classe pública MyRandom implementa Runnable{
privado estático int aleatório;
privado estático int f=127;
privado estático int m=(int)Math.pow(2,16);
private static int[] r=getR();
privado estático int x = 13;
@Substituir
execução nula pública(){
for(;!Thread.interrupted();){
f=((f/2)+r[f])%m;
aleatório=r[f];
}
}
privado estático int[] getR(){
// Armazena os 65536 números 0-65536 em r[] em uma determinada ordem
int[] r=novo int[m];
r[0]=13849;
for(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;
retornar r;
}
private static void changeR(int[] r,int f){
int[] r1=novo int[r.comprimento];
System.arraycopy(r,0,r1,0,r.length);
for(int i=0;i<r.comprimento;i++){
r[i]=r1[(i+f)%m];
}
}
público estático duplo getRandom_0_1(){
duplo[] dd=novo duplo[13];
for(int i=0;i<dd.length;i++){
Executável executável=new MyRandom();
Thread thread=new Thread(executável);
thread.start();
tentar{
Thread.sleep(x+1);
}
catch(InterruptedException e){
e.getMessage();
}
thread.interrupt();
duplo rr=(duplo)aleatório/(duplo)m;
x=f%13;
mudarR(r,11+(f/7));
dd[i]=rr;
if((i>0)&&(dd[i]==dd[i-1])){
alterarR(r,13+(f/11));
// Evita o impacto dos pontos fixos no programa Quando os dois valores são iguais, significa que o programa pode ter entrado em um beco sem saída, ou seja, um ponto fixo. pode se referir ao conhecimento de funções em matemática avançada.
}
}
corrida dupla=dd[12];
retorno executado;
}
public static void main(String[] args){
duplo rs=getRandom_0_1();
System.out.println(rs);
}
}