Из-за влияния некоторых неконтролируемых факторов, таких как системная память, состояние компьютера и т. д., количество выполнения цикла while будет каждый раз разным.
Наверное, сотни раз. Это приводит к различиям в результатах.
Обратите внимание, что эта программа использует множество статических переменных. То есть, когда следующий поток продолжает выполнять тот же метод запуска, что и предыдущий поток, его начальным значением является значение после выполнения предыдущего потока. Это формирует классический эффект бабочки. Эта разница усиливается, что приводит к окончательной генерации случайных чисел.
В этой программе всего открывается 13 потоков, и каждый раз значения этих статических переменных перемещаются в хаотическом направлении.
Поэтому степень путаницы итогового массива double[]bb возрастает геометрически.
Начальный bb[0] имеет всего около нескольких сотен возможных значений, а когда дело доходит до bb[3], это может быть любое из 65536 данных.
Чтобы добиться случайности, я проделал цикл 13 раз, и можно сказать, что bb[12] почти абсолютно случайен.
Скопируйте код кода следующим образом:
/**
* Автор:Юаньхунлун
* Дата: 9 января 2014 г.
*/
публичный класс MyRandom реализует Runnable{
частный статический int случайный;
частный статический int f = 127;
частный статический int m=(int)Math.pow(2,16);
частный статический int[] r=getR();
частный статический int x = 13;
@Override
общественный недействительный запуск () {
for(;!Thread.interrupted();){
f=((f/2)+r[f])%m;
случайный = г [ф];
}
}
частный статический int[] getR(){
//Сохраняем 65536 чисел 0-65536 в r[] в определенном порядке
int[] r=новый int[m];
г[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];
г[(f+1)%m]=k;
вернуть р;
}
Private static void ChangeR(int[] r,int f){
//Переместить r[]
int[] r1=новый 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];
}
}
публичный статический двойной getRandom_0_1(){
двойной[] dd=новый двойной[13];
for(int i=0;i<dd.length;i++){
Runnable runnable = новый MyRandom();
Поток поток = новый поток (работоспособный);
поток.start();
пытаться{
Thread.sleep(x+1);
}
поймать (InterruptedException е) {
е.getMessage();
}
поток.прерывание();
двойной rr=(double)случайный/(double)m;
х=е%13;
изменитьR(r,11+(f/7));
дд[я]=рр;
if((i>0)&&(dd[i]==dd[i-1])){
изменитьR(r,13+(f/11));
//Предотвратить влияние фиксированных точек на программу. Когда два значения совпадают, это означает, что программа, возможно, зашла в тупик, то есть в фиксированную точку. По вопросам о фиксированных точках обращайтесь. может относиться к знанию функций в высшей математике.
}
}
двойной прогон = дд[12];
возврат побежал;
}
public static void main(String[] args){
двойной rs=getRandom_0_1();
System.out.println(rs);
}
}
MyRandom.java
Скопируйте код кода следующим образом:
/**
* Автор:Юаньхунлун
* Дата: 9 января 2014 г.
*/
пакет mine.loop;
публичный класс MyRandom реализует Runnable{
частный статический int случайный;
частный статический int f = 127;
частный статический int m=(int)Math.pow(2,16);
частный статический int[] r=getR();
частный статический int x = 13;
@Override
общественный недействительный запуск () {
for(;!Thread.interrupted();){
f=((f/2)+r[f])%m;
случайный = г [ф];
}
}
частный статический int[] getR(){
// Сохраняем 65536 чисел 0-65536 в r[] в определенном порядке
int[] r=новый int[m];
г[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];
г[(f+1)%m]=k;
вернуть р;
}
Private static void ChangeR(int[] r,int f){
int[] r1=новый 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];
}
}
публичный статический двойной getRandom_0_1(){
двойной[] dd=новый двойной[13];
for(int i=0;i<dd.length;i++){
Runnable runnable = новый MyRandom();
Поток поток = новый поток (работоспособный);
поток.start();
пытаться{
Thread.sleep(x+1);
}
поймать (InterruptedException е) {
е.getMessage();
}
поток.прерывание();
двойной rr=(double)случайный/(double)m;
х=е%13;
изменитьR(r,11+(f/7));
дд[я]=рр;
if((i>0)&&(dd[i]==dd[i-1])){
изменитьR(r,13+(f/11));
// Предотвратить влияние фиксированных точек на программу. Когда два значения совпадают, это означает, что программа, возможно, зашла в тупик, то есть в фиксированную точку. По вопросам о фиксированных точках обращайтесь. может относиться к знанию функций в высшей математике.
}
}
двойной прогон = дд[12];
возврат побежал;
}
public static void main(String[] args){
двойной rs=getRandom_0_1();
System.out.println(rs);
}
}