Aufgrund des Einflusses einiger unkontrollierbarer Faktoren wie Systemspeicher, Computerstatus usw. ist die Anzahl der Ausführungen in der While-Schleife jedes Mal unterschiedlich.
Wahrscheinlich hunderte Male. Dies führt zu unterschiedlichen Ergebnissen.
Beachten Sie, dass dieses Programm viele statische Variablen verwendet. Das heißt, wenn der nächste Thread weiterhin dieselbe Ausführungsmethode wie der vorherige Thread ausführt, ist sein Anfangswert der Wert nach der Ausführung des vorherigen Threads . Dieser Unterschied wird verstärkt, was zur endgültigen Zufallszahlengenerierung führt.
In diesem Programm werden insgesamt 13 Threads geöffnet und jedes Mal werden die Werte dieser statischen Variablen in eine chaotische Richtung verschoben.
Daher nimmt der Verwirrungsgrad des endgültigen Arrays double[] bb geometrisch zu.
Der anfängliche bb[0] hat nur etwa ein paar hundert mögliche Werte, und wenn es um bb[3] geht, kann es sich um einen beliebigen von 65536 Daten handeln.
Um Zufälligkeit zu erreichen, habe ich 13 Schleifen durchlaufen, und bb[12] kann als nahezu absolut zufällig bezeichnet werden.
Kopieren Sie den Codecode wie folgt:
/**
* Autor:Yuanhonglong
* Datum: 9.1.2014
*/
Die öffentliche Klasse MyRandom implementiert Runnable{
privates statisches int zufällig;
privates statisches int f=127;
private static int m=(int)Math.pow(2,16);
privates static int[] r=getR();
privates statisches int x=13;
@Override
public void run(){
for(;!Thread.interrupted();){
f=((f/2)+r[f])%m;
random=r[f];
}
}
privates static int[] getR(){
//Speichern Sie die 65536 Zahlen 0-65536 in r[] in einer bestimmten Reihenfolge
int[] r=new int[m];
r[0]=13849;
for(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;
return r;
}
private static void changeR(int[] r,int f){
//Verschiebe r[]
int[] r1=new int[r.length];
System.arraycopy(r,0,r1,0,r.length);
for(int i=0;i<r.length;i++){
r[i]=r1[(i+f)%m];
}
}
öffentliches statisches Double getRandom_0_1(){
double[] dd=new double[13];
for(int i=0;i<dd.length;i++){
Runnable runnable=new MyRandom();
Thread thread=new Thread(runnable);
thread.start();
versuchen{
Thread.sleep(x+1);
}
Catch(InterruptedException e){
e.getMessage();
}
thread.interrupt();
double rr=(double)random/(double)m;
x=f%13;
changeR(r,11+(f/7));
dd[i]=rr;
if((i>0)&&(dd[i]==dd[i-1])){
changeR(r,13+(f/11));
// Verhindern Sie die Auswirkung von Fixpunkten auf das Programm. Wenn die beiden Werte gleich sind, bedeutet dies, dass das Programm möglicherweise in eine Sackgasse geraten ist, d. h. in einen Fixpunkt kann sich auf das Wissen über Funktionen in der fortgeschrittenen Mathematik beziehen.
}
}
double ran=dd[12];
Rückkehr rannte;
}
public static void main(String[] args){
double rs=getRandom_0_1();
System.out.println(rs);
}
}
MyRandom.java
Kopieren Sie den Codecode wie folgt:
/**
* Autor:Yuanhonglong
* Datum: 9.1.2014
*/
Paket mine.loop;
Die öffentliche Klasse MyRandom implementiert Runnable{
privates statisches int zufällig;
privates statisches int f=127;
private static int m=(int)Math.pow(2,16);
privates static int[] r=getR();
privates statisches int x=13;
@Override
public void run(){
for(;!Thread.interrupted();){
f=((f/2)+r[f])%m;
random=r[f];
}
}
privates static int[] getR(){
// Speichere die 65536 Zahlen 0-65536 in r[] in einer bestimmten Reihenfolge
int[] r=new int[m];
r[0]=13849;
for(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;
return r;
}
private static void changeR(int[] r,int f){
int[] r1=new int[r.length];
System.arraycopy(r,0,r1,0,r.length);
for(int i=0;i<r.length;i++){
r[i]=r1[(i+f)%m];
}
}
öffentliches statisches Double getRandom_0_1(){
double[] dd=new double[13];
for(int i=0;i<dd.length;i++){
Runnable runnable=new MyRandom();
Thread thread=new Thread(runnable);
thread.start();
versuchen{
Thread.sleep(x+1);
}
Catch(InterruptedException e){
e.getMessage();
}
thread.interrupt();
double rr=(double)random/(double)m;
x=f%13;
changeR(r,11+(f/7));
dd[i]=rr;
if((i>0)&&(dd[i]==dd[i-1])){
changeR(r,13+(f/11));
// Verhindern Sie die Auswirkungen von Fixpunkten auf das Programm. Wenn die beiden Werte gleich sind, bedeutet dies, dass das Programm möglicherweise in eine Sackgasse geraten ist, d. h. in einen Fixpunkt kann sich auf das Wissen über Funktionen in der fortgeschrittenen Mathematik beziehen.
}
}
double ran=dd[12];
Rückkehr rannte;
}
public static void main(String[] args){
double rs=getRandom_0_1();
System.out.println(rs);
}
}