Karena pengaruh beberapa faktor yang tidak dapat dikendalikan, seperti memori sistem, status komputer, dll., jumlah eksekusi dalam perulangan while akan berbeda setiap saat.
Mungkin ratusan kali. Hal ini menyebabkan perbedaan hasil.
Perhatikan bahwa program ini menggunakan banyak variabel statis. Artinya, ketika thread berikutnya terus menjalankan metode run yang sama seperti thread sebelumnya, nilai awalnya adalah nilai setelah eksekusi thread sebelumnya . Perbedaan ini diperkuat, mengarah pada pembentukan bilangan acak terakhir.
Dalam program ini, total 13 thread dibuka, dan setiap kali nilai variabel statis tersebut didorong ke arah yang kacau.
Oleh karena itu, tingkat kebingungan dari array akhir double[] bb meningkat secara geometris.
bb[0] awal hanya memiliki sekitar beberapa ratus kemungkinan nilai, dan jika menyangkut bb[3], nilai tersebut dapat berupa salah satu dari 65536 data.
Untuk mencapai keacakan, saya mengulang sebanyak 13 kali, dan bb[12] dapat dikatakan hampir sepenuhnya acak.
Copy kode kodenya sebagai berikut:
/**
* Penulis: Yuanhonglong
* Tanggal: 9-1-2014
*/
kelas publik MyRandom mengimplementasikan Runnable{
pribadi statis int acak;
pribadi statis int f=127;
private static int m=(int)Math.pow(2,16);
pribadi statis int[] r=getR();
int statis pribadi x=13;
@Mengesampingkan
menjalankan kekosongan publik(){
for(;!Thread.interrupted();){
f=((f/2)+r[f])%m;
acak=r[f];
}
}
int statis pribadi[] getR(){
//Simpan angka 65536 0-65536 ke dalam r[] dengan urutan tertentu
int[] r=int baru[m];
r[0]=13849;
untuk(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;
kembali r;
}
perubahan kekosongan statis pribadiR(int[] r,int f){
//Pindahkan r[]
int[] r1=int baru[r.panjang];
System.arraycopy(r,0,r1,0,r.panjang);
for(int i=0;i<r.panjang;i++){
r[i]=r1[(i+f)%m];
}
}
getRandom_0_1() ganda statis publik
ganda[] dd=ganda baru[13];
for(int i=0;i<dd.panjang;i++){
Runnable runnable=baru MyRandom();
Thread thread=Thread baru(dapat dijalankan);
thread.mulai();
mencoba{
Thread.tidur(x+1);
}
menangkap(InterruptedException e){
e.getMessage();
}
thread.interrupt();
ganda rr=(ganda)acak/(ganda)m;
x=f%13;
ubahR(r,11+(f/7));
hh[i]=rr;
jika((i>0)&&(dd[i]==dd[i-1])){
ubahR(r,13+(f/11));
//Mencegah dampak titik tetap pada program. Jika kedua nilainya sama, berarti program tersebut mungkin telah memasuki jalan buntu, yaitu titik tetap dapat merujuk pada pengetahuan fungsi dalam matematika tingkat lanjut.
}
}
lari ganda=dd[12];
kembali berlari;
}
public static void main(String[] args){
ganda rs=getRandom_0_1();
Sistem.keluar.println(rs);
}
}
MyRandom.java
Copy kode kodenya sebagai berikut:
/**
* Penulis: Yuanhonglong
* Tanggal: 9-1-2014
*/
paket milikku.loop;
kelas publik MyRandom mengimplementasikan Runnable{
pribadi statis int acak;
pribadi statis int f=127;
private static int m=(int)Math.pow(2,16);
pribadi statis int[] r=getR();
int statis pribadi x=13;
@Mengesampingkan
menjalankan kekosongan publik(){
for(;!Thread.interrupted();){
f=((f/2)+r[f])%m;
acak=r[f];
}
}
int statis pribadi[] getR(){
// Simpan angka 65536 0-65536 di r[] dengan urutan tertentu
int[] r=int baru[m];
r[0]=13849;
untuk(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;
kembali r;
}
perubahan kekosongan statis pribadiR(int[] r,int f){
int[] r1=int baru[r.panjang];
System.arraycopy(r,0,r1,0,r.panjang);
for(int i=0;i<r.panjang;i++){
r[i]=r1[(i+f)%m];
}
}
getRandom_0_1() ganda statis publik
ganda[] dd=ganda baru[13];
for(int i=0;i<dd.panjang;i++){
Runnable runnable=baru MyRandom();
Thread thread=Thread baru(dapat dijalankan);
thread.mulai();
mencoba{
Thread.tidur(x+1);
}
menangkap(InterruptedException e){
e.getMessage();
}
thread.interrupt();
ganda rr=(ganda)acak/(ganda)m;
x=f%13;
ubahR(r,11+(f/7));
hh[i]=rr;
jika((i>0)&&(dd[i]==dd[i-1])){
ubahR(r,13+(f/11));
// Mencegah dampak titik tetap pada program. Jika kedua nilainya sama, berarti program tersebut mungkin telah memasuki jalan buntu, yaitu titik tetap dapat merujuk pada pengetahuan fungsi dalam matematika tingkat lanjut.
}
}
lari ganda=dd[12];
kembali berlari;
}
public static void main(String[] args){
ganda rs=getRandom_0_1();
Sistem.keluar.println(rs);
}
}