كيف ومبدأ الأرقام العشوائية في جافا
تحقق من المعلومات المتعلقة بالأرقام العشوائية وتنظيمها بشكل خاص
أولاً ، دعنا نتحدث عن عدة طرق لتوليد أرقام عشوائية في جافا
en. . . في الواقع ، يتم استخدام الطريقة الثالثة أعلاه لإنشاء أرقام عشوائية في طريقة البناء الافتراضية لـ Random.
هناك طريقتان لبناء فئة عشوائية في الطريقة 2: مع البذور وبدون البذور
بدون البذور: سترجع هذه الطريقة أرقام عشوائية ، ونتائج كل تشغيل مختلفة ، وهو ما يعادل استخدام System.CurrentTimeMillis () كبذور.
مع البذور: وبهذه الطريقة ، ستكون نتيجة العودة هي نفسها بغض النظر عن عدد المرات التي يتم فيها تشغيل البرنامج. إذا تم إنشاء حالتين عشوائيتين بنفس البذور ، فسيتم إجراء نفس تسلسل مكالمات الطريقة لكل حالة وسوف يقومان بإنشاء وتسلف الأرقام نفسها.
عدد العشوائي الزائف
أرقام عشوائية في أجهزة الكمبيوتر هي أرقام عشوائية زائفة
هنا برنامج C مثل هذا:
// rand_1.cpp#include <stdlib.h> static int int rand_seed ؛ unded int random (void) {rand_seed = (rand_seed*123+59) ٪ 65536 ؛ return (rand_seed) ؛} void random_start (void) {int temp [2] ؛ quadata (0x0040،0x006c ، fp_seg (temp) ، fp_off (temp) ، 4) ؛ rand_seed = temp [0] ؛} void main () {unsigned int i ، n ؛ random_start () ؛ لـ (i = 0 ؛ i <10 ؛ i ++) printf ("#u/t" ، عشوائي ()) ؛ printf ("/n") ؛} يشرح بالكامل عملية توليد الأرقام العشوائية:
أولاً،
quadata (0x0040،0x006c ، fp_seg (temp) ، fp_off (temp) ، 4) ؛
يتم استخدام هذه الوظيفة لنقل بيانات الذاكرة. FP_SEG (المؤشر البعيد إلى القطاع) هي وظيفة تأخذ عنوان المقطع لمصفوفة مؤقتة ، FP_OFF (مؤشر البعيد إلى الإزاحة) هي وظيفة تأخذ العنوان النسبي لمصفوفة مؤقتة ، وتتمثل وظيفة Quotata في وضع الكلمات المزدوجة الموجودة في وحدة التخزين 0040: 006CH إلى وحدة الذاكرة التي تم إعلانها بالمسافة المؤقتة. وبهذه الطريقة ، يمكن إرسال رقم 16 بت في 0040: 006Ch إلى Rand_seed من خلال صفيف temp.
ثانية،
rand_seed = (rand_seed*123+59) ٪ 65536 ؛
إنها طريقة تستخدم لحساب الأرقام العشوائية. تختلف طريقة الحساب للأرقام العشوائية في أجهزة الكمبيوتر المختلفة ، حتى في أنظمة التشغيل المختلفة المثبتة في نفس الكمبيوتر. لقد جربته في Linux و Windows على التوالي. تختلف الأرقام العشوائية التي تم إنشاؤها بواسطة نفس البذور العشوائية في هذين نظام التشغيل ، مما يعني أن لديهم طرق حساب مختلفة.
ثم،
quadata (0x0040،0x006c ، fp_seg (temp) ، fp_off (temp) ، 4) ؛
لماذا يجب استرداد البذور العشوائية في 0040: 006Ch في الذاكرة؟ ما هو مخزّن في 0040: 006ch؟
قد يتذكر أولئك الذين درسوا "مبادئ مكونات الكمبيوتر وتكنولوجيا الواجهة" أنه عند تجميع برنامج خدمة مقاطعة ROM BIOS ، يتم استخدام التوقيت/العداد Intel 8253. يتيح التواصل مع شريحة Intel 8259 لمقاطعة برنامج خدمة المقاطعة العمل. يتم إنشاء المقاطعات 18.2 التي تم إنشاؤها بواسطة اللوحة الأم في الثانية بواسطة المعالج يتحكم في شريحة المقاطعة بناءً على قيمة التوقيت/العداد. يوجد مثل هذا التوقيت/العداد على اللوحة الأم لجهاز الكمبيوتر الخاص بنا لحساب وقت النظام الحالي. سيتم إضافة العداد في كل مرة تمر دورة إشارة الساعة. أين تخزين قيمة هذا العداد؟ هذا صحيح ، فقط في 0040: 006CH في الذاكرة ، يتم تعريف مساحة الذاكرة هذه فعليًا مثل هذا:
timer_low dw؟ ؛ العنوان 0040: 006CH
timer_high dw؟ ؛ العنوان هو 0040: 006EH
Timer_oft DB؟ ؛ العنوان 0040: 0070H
في برنامج خدمة المقاطعة على مدار الساعة ، عندما يتحول Timer_Low بالكامل ، فإن العداد سيتحول أيضًا إلى كامل ، وتكون قيمة العداد صفرًا ، أي ثنائي 16 بت في Timer_low يتم صفره ، ويتم إضافة Timer_high واحدًا. في Rand01.C
quadata (0x0040،0x006c ، fp_seg (temp) ، fp_off (temp) ، 4) ؛
هو بالضبط الرقمين الثنائيين 16 بت timer_low و timer_high التي يتم وضعها في صفيف temp وإرسالها إلى Rand_seed ، وبالتالي الحصول على "البذور العشوائية".
الآن ، هناك شيء واحد يمكن تحديده هو أن البذور العشوائية تأتي من ساعة النظام ، أو بالأحرى قيمة السجل في الذاكرة من التوقيت/العداد على اللوحة الأم للكمبيوتر.
en ... لا آخر. . LVL--
دعونا نلقي نظرة على قطعة أخرى من الكود:
//rand_2.cpp#include <IoStream> #include <CstdLib> باستخدام مساحة الاسم std ؛ int main () {srand ((unsigned) time (null)) ؛ غير موقعة int r = rand () ؛ cout << "r =" << r << endl ؛ // وفقًا لمعايير C ++ 98 ، يمكن تقديم الوظيفة الرئيسية دون استخدام عبارة الإرجاع للعودة 0 ؛} هنا ، إذا لم يضبط المستخدم والبرامج الأخرى بذرة عشوائية ، يتم استخدام قيمة توقيت النظام/العداد كبذور عشوائية. لذلك ، في نفس بيئة النظام الأساسي ، بعد تجميع وتوليد EXE ، في كل مرة تقوم فيها بتشغيله ، سيكون الرقم العشوائي المعروض رقمًا عشوائيًا زائدًا ، أي أن النتائج المعروضة ستكون مختلفة في كل مرة تقوم فيها بتشغيله.
لخص
الأرقام العشوائية هي قيم محسوبة بواسطة البذور العشوائية بناءً على طرق حساب معينة. لذلك ، طالما أن طريقة الحساب مؤكدة والبذور العشوائي مؤكد ، فإن الرقم العشوائي الذي تم إنشاؤه لن يتغير. في نفس بيئة النظام الأساسي ، بعد تجميع وتوليد EXE ، تكون الأرقام العشوائية المعروضة هي نفسها في كل مرة تقوم فيها بتشغيلها. هذا لأنه في نفس بيئة منصة التجميع ، تكون طرق الحساب لإنشاء أرقام عشوائية من البذور العشوائية هي نفسها ، والبذور العشوائية هي نفسها ، لذلك فإن الأرقام العشوائية المتولدة هي نفسها.
طالما أن المستخدم أو الطرف الثالث لا يقوم بتعيين بذرة عشوائية ، ثم تأتي البذور العشوائية افتراضيًا من ساعة النظام (أي قيمة التوقيت/العداد)
شكرا لك على القراءة ، آمل أن تساعدك. شكرا لك على دعمك لهذا الموقع!