نظرًا لتأثير بعض العوامل التي لا يمكن التحكم فيها، مثل ذاكرة النظام وحالة الكمبيوتر وما إلى ذلك، سيكون عدد عمليات التنفيذ في الحلقة أثناء الحلقة مختلفًا في كل مرة.
ربما مئات المرات. وهذا يؤدي إلى اختلافات في النتائج.
لاحظ أن هذا البرنامج يستخدم العديد من المتغيرات الثابتة، أي أنه عندما يستمر الخيط التالي في تنفيذ نفس طريقة التشغيل مثل الخيط السابق، فإن قيمته الأولية هي القيمة بعد تنفيذ الخيط السابق، وهذا يشكل تأثير الفراشة الكلاسيكي ويتم تضخيم هذا الاختلاف، مما يؤدي إلى توليد الأرقام العشوائية النهائية.
في هذا البرنامج، يتم فتح إجمالي 13 موضوعًا، وفي كل مرة يتم دفع قيم تلك المتغيرات الثابتة في اتجاه فوضوي.
ولذلك، فإن درجة الارتباك في المصفوفة النهائية double[] bb تزداد هندسيًا.
يحتوي bb[0] الأولي على بضع مئات من القيم المحتملة فقط، وعندما يتعلق الأمر بـ bb[3]، فيمكن أن يكون أيًا من بيانات 65536.
من أجل تحقيق العشوائية، قمت بالتكرار 13 مرة، ويمكن القول أن bb[12] عشوائي تمامًا تقريبًا.
انسخ رمز الكود كما يلي:
/**
* المؤلف: يوانهونغ لونغ
* التاريخ:2014-1-9
*/
الطبقة العامة MyRandom تنفذ Runnable {
ثابت خاص عشوائي؛
كثافة العمليات الثابتة الخاصة f=127;
خاص ثابت int m=(int)Math.pow(2,16);
خاص ثابت int[] r=getR();
عدد صحيح ثابت خاص x=13;
@تجاوز
تشغيل الفراغ العام () {
ل(;!Thread.interrupt();){
f=((f/2)+r[f])%m;
عشوائي=ص[f];
}
}
int ثابت خاص[] getR(){
// احفظ الأرقام 65536 0-65536 في r[] بترتيب معين
int[] r=new int[m];
ص[0]=13849;
ل(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;
العودة ص؛
}
تغيير الفراغ الثابت الخاصR(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];
}
}
getRandom_0_1 () مزدوج ثابت عام
double[] dd=new double[13];
for(int i=0;i<dd.length;i++){
Runnable runnable=new MyRandom();
موضوع الموضوع = موضوع جديد (قابل للتشغيل) ؛
Thread.start();
يحاول{
Thread.sleep(x+1);
}
قبض على (InterruptedException ه) {
e.getMessage();
}
Thread.interrupt();
مزدوج ص = (مزدوج) عشوائي / (مزدوج) م؛
س=و%13;
ChangeR(r,11+(f/7));
dd[i]=rr;
إذا((i>0)&&(dd[i]==dd[i-1])){
ChangeR(r,13+(f/11));
// منع تأثير النقاط الثابتة على البرنامج. عندما تكون القيمتان متماثلتين، فهذا يعني أن البرنامج قد دخل في طريق مسدود، أي نقطة ثابتة يمكن أن تشير إلى معرفة الوظائف في الرياضيات المتقدمة.
}
}
ركض مزدوج=dd[12];
ركض العودة؛
}
public static void main(String[] args){
double rs=getRandom_0_1();
System.out.println(rs);
}
}
MyRandom.java
انسخ رمز الكود كما يلي:
/**
* المؤلف: يوانهونغ لونغ
* التاريخ:2014-1-9
*/
package mine.loop;
الطبقة العامة MyRandom تنفذ Runnable {
ثابت خاص عشوائي؛
كثافة العمليات الثابتة الخاصة f=127;
خاص ثابت int m=(int)Math.pow(2,16);
خاص ثابت int[] r=getR();
عدد صحيح ثابت خاص x=13;
@تجاوز
تشغيل الفراغ العام () {
ل(;!Thread.interrupt();){
f=((f/2)+r[f])%m;
عشوائي=ص[f];
}
}
int ثابت خاص[] getR(){
// قم بتخزين أرقام 65536 0-65536 في r[] بترتيب معين
int[] r=new int[m];
ص[0]=13849;
ل(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;
العودة ص؛
}
تغيير الفراغ الثابت الخاصR(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];
}
}
getRandom_0_1 () مزدوج ثابت عام
double[] dd=new double[13];
for(int i=0;i<dd.length;i++){
Runnable runnable=new MyRandom();
موضوع الموضوع = موضوع جديد (قابل للتشغيل) ؛
Thread.start();
يحاول{
Thread.sleep(x+1);
}
قبض على (InterruptedException ه) {
e.getMessage();
}
Thread.interrupt();
مزدوج ص = (مزدوج) عشوائي / (مزدوج) م؛
س=و%13;
ChangeR(r,11+(f/7));
dd[i]=rr;
إذا((i>0)&&(dd[i]==dd[i-1])){
ChangeR(r,13+(f/11));
// منع تأثير النقاط الثابتة على البرنامج. عندما تكون القيمتان متماثلتين، فهذا يعني أن البرنامج قد دخل في طريق مسدود، أي نقطة ثابتة، بالنسبة للأسئلة حول النقاط الثابتة يمكن أن تشير إلى معرفة الوظائف في الرياضيات المتقدمة.
}
}
ركض مزدوج=dd[12];
ركض العودة؛
}
public static void main(String[] args){
double rs=getRandom_0_1();
System.out.println(rs);
}
}