مولد الأرقام العشوائية: كيف تولد أجهزة الكمبيوتر أرقامًا عشوائية؟

لقد استخدم الناس أرقامًا عشوائية لآلاف السنين ، لذا فإن المفهوم ليس جديدًا. من اليانصيب في بابل القديمة ، إلى طاولات الروليت في مونت كارلو ، إلى ألعاب النرد في فيجاس ، الهدف هو ترك النتيجة النهائية لفرصة عشوائية.

لكن بغض النظر عن المقامرة ، فإن العشوائية لها استخدامات عديدة في العلوم والإحصاء والتشفير وغير ذلك. ومع ذلك ، فإن استخدام النرد أو العملات المعدنية أو الوسائط المماثلة كجهاز عشوائي له حدوده.

بسبب الطبيعة الميكانيكية لهذه التقنيات ، فإن توليد كميات كبيرة من الأرقام العشوائية يتطلب قدرًا كبيرًا من الوقت والعمل. بفضل براعة الإنسان ، لدينا أدوات وأساليب أكثر قوة تحت تصرفنا.

طرق توليد الأرقام العشوائية

أرقام عشوائية حقيقية

روبوت إلكترونيات ذو شكل حر يبحث حوله

لنفكر في طريقتين أساسيتين تستخدمان لإنشاء أرقام عشوائية. و الطريقة الأولى هييعتمد على عملية فيزيائية ، ويحصد مصدر العشوائية من بعض الظواهر الفيزيائية التي يتوقع أن تكون عشوائية .

تحدث هذه الظاهرة خارج الكمبيوتر. يتم قياسه وتعديله من أجل التحيزات المحتملة بسبب عملية القياس. تشمل الأمثلة التحلل الإشعاعي والتأثير الكهروضوئي وإشعاع الخلفية الكونية والضوضاء الجوية (التي سنستخدمها في هذه المقالة) والمزيد.

وبالتالي ، يُقال أن الأرقام العشوائية التي تم إنشاؤها بناءً على هذه العشوائية هي أرقام عشوائية " حقيقية ".

من الناحية الفنية ، يتكون جزء الأجهزة من جهاز يحول الطاقة من شكل إلى آخر (على سبيل المثال ، الإشعاع إلى إشارة كهربائية) ، ومكبر للصوت ، ومحول تناظري إلى رقمي لتحويل الإخراج إلى رقم رقمي.

ما هي الأرقام شبه العشوائية؟

كود الهجوم الثنائي للهاكر.  مصنوعة من Canon 5d Mark III والعدسة التناظرية القديمة ، Leica APO Macro Elmarit-R 2.8 100mm (السنة: 1993)

كبديل للأرقام العشوائية "الحقيقية" ، تتضمن الطريقة الثانية لتوليد الأرقام العشوائية خوارزميات حسابية يمكن أن تنتج نتائج عشوائية على ما يبدو.

لماذا يبدو عشوائيًا؟ لأن النتائج النهائية التي تم الحصول عليها يتم تحديدها بالكامل في الواقع من خلال قيمة أولية تُعرف أيضًا باسم القيمة الأولية أو المفتاح . لذلك ، إذا كنت تعرف قيمة المفتاح وكيف تعمل الخوارزمية ، يمكنك إعادة إنتاج هذه النتائج التي تبدو عشوائية.

وكثيرا ما دعا عدد المولدات عشوائية من هذا النوع عدد المزيف المولدات، ونتيجة لذلك، أرقام الناتج المزيف.

على الرغم من أن هذا النوع من المولدات لا يجمع عادةً أي بيانات من مصادر عشوائية تحدث بشكل طبيعي ، يمكن جعل هذا التجميع للمفاتيح ممكنًا عند الحاجة.

دعونا نقارن بعض جوانب مولدات الأرقام العشوائية الحقيقية أو TRNG s ومولدات الأرقام العشوائية الكاذبة أو PRNG s.

PRNGs أسرع من TRNGs. بسبب طبيعتها الحتمية ، فهي مفيدة عندما تحتاج إلى إعادة سلسلة من الأحداث العشوائية. هذا يساعد كثيرًا في اختبار الكود ، على سبيل المثال.

من ناحية أخرى ، لا تعتبر TRNGs دورية وتعمل بشكل أفضل في الأدوار الأمنية الحساسة مثل التشفير.

A الفترة هو عدد مرات التكرار لPRNG يمر قبل أن تبدأ يعيد نفسه. وبالتالي ، عند تساوي جميع الأشياء الأخرى ، فإن PRNG ذي الفترة الأطول سيستغرق المزيد من موارد الكمبيوتر للتنبؤ والتصدع.

نموذج خوارزمية لمولد الأرقام العشوائية الزائفة

ينفذ الكمبيوتر التعليمات البرمجية التي تستند إلى مجموعة من القواعد الواجب اتباعها. بالنسبة إلى PRNGs بشكل عام ، تدور هذه القواعد حول ما يلي:

  1. اقبل بعض رقم الإدخال الأولي ، أي رقم أولي أو مفتاح.
  2. طبق هذه البذرة في سلسلة من العمليات الحسابية لتوليد النتيجة. هذه النتيجة هي الرقم العشوائي.
  3. استخدم هذا الرقم العشوائي الناتج كأساس للتكرار التالي.
  4. كرر العملية لمحاكاة العشوائية.

الآن دعونا نلقي نظرة على مثال.

المولد الخطي المتطابق

ينتج هذا المولد سلسلة من الأرقام شبه العشوائية. بالنظر إلى المعلمات الأولية X 0 والمعلمات الصحيحة a كمضاعف ، و b كزيادة ، و m كمعامل ، يتم تعريف المولد بالعلاقة الخطية: X n ≡ (aX n-1 + b) mod m . أو استخدام بناء جملة أكثر ملاءمة للبرمجة: X n = (a * X n-1 + b)٪ m .

يجب على كل من هؤلاء الأعضاء استيفاء الشروط التالية:

  • م> 0 (المعامل موجب) ،
  • 0 <أ <م (المضاعف موجب ولكنه أقل من المعامل) ،
  • 0ب <م (الزيادة غير سالبة ولكنها أقل من المعامل) ، و
  • 0X 0 (البذرة ليست سالبة ولكنها أقل من المعامل).

لنقم بإنشاء دالة JavaScript تأخذ القيم الأولية كوسيطات وتعيد مصفوفة من الأرقام العشوائية بطول معين:

 // x0=seed; a=multiplier; b=increment; m=modulus; n=desired array length; const linearRandomGenerator = (x0, a, b, m, n) => { const results = [] for (let i = 0; i < n; i++) { x0 = (a * x0 + b) % m results.push(x0) } return results } 

المولد الخطي المطابق هو أحد أقدم وأشهر خوارزميات PRNG.

بالنسبة لخوارزميات إنشاء الأرقام العشوائية القابلة للتنفيذ بواسطة أجهزة الكمبيوتر ، فإنها تعود إلى أربعينيات وخمسينيات القرن الماضي (طريقة المربع الأوسط ومولد Lehmer ، على سبيل المثال) وتستمر كتابتها اليوم (Xoroshiro128 + ، Squares RNG ، والمزيد) .

نموذج مولد رقم عشوائي

عندما قررت كتابة هذا المقال حول تضمين منشئ أرقام عشوائي داخل صفحة ويب ، كان لدي خيار للقيام به.

كان بإمكاني استخدام Math.random()وظيفة JavaScript كأساس وإنشاء مخرجات بأرقام شبه عشوائية كما فعلت في مقالات سابقة (انظر مخطط الضرب - جدول الأوقات الخاص بك).

لكن هذه المقالة نفسها تدور حول توليد أرقام عشوائية. لذلك قررت أن أتعلم كيفية جمع البيانات "الحقيقية" القائمة على العشوائية ومشاركة اكتشافاتي معك.

حتى أدناه هو "صحيح" مولد الأرقام العشوائية. اضبط المعلمات واضغط على إنشاء.

مولد الأرقام العشوائي الحقيقي ثنائي عشري عشري ينتج النتيجة:

The code fetches data from one of the APIs, courtesy of Random.org. This online resource has a plethora of useful, customizable tools and comes with excellent documentation to go with it.

The randomness comes from atmospheric noise. I was able to use asynchronous functions. That is a huge benefit going forward. The core function looks like this:

 // Generates a random number within user indicated interval const getRandom = async (min, max, base) => { const response = await  fetch("//www.random.org/integers/?num=1&min="+min+" &max="+max+"&col=1&base="+base+"&format=plain&rnd=new") return response.text() }

The parameters it takes allow a user to customize random number output. For example, min and max allow you to set lower and upper limits on generated output. And base determines if the output is printed as binary, decimal or hexadecimal.

Again, I chose this configuration but there are many more available at the source.

عند النقر فوق الزر "إنشاء" ، handleGenerate()يتم استدعاء الوظيفة. وهو بدوره يستدعي getRandom()الوظيفة غير المتزامنة ، ويدير معالجة الأخطاء ، ويخرج بنتائج:

 // Output handling const handleGenerate = () => { handleActive(generateButton) const base = binary.checked ? 2 : decimal.checked ? 10 : 16 if (!minimum.value || !maximum.value) { prompter.style.color = 'red' prompter.textContent = "Enter Min & Max values" } else { getRandom(minimum.value, maximum.value, base).then((data) => { resultValue.textContent = data prompter.textContent = "" }).catch((error) => { resultValue.textContent = 'ERROR' prompter.textContent = 'Connection error. Unable to generate'; }) handleRestart() } } 

تتعامل بقية الكود مع بنية HTML ومظهرها وتصميمها.

الرمز جاهز ليتم تضمينه واستخدامه في صفحة الويب هذه. لقد فصلته إلى أجزاء مكونة وزودته بتعليقات مفصلة. يمكن تعديله بسهولة. يمكنك أيضًا تعديل الوظائف والأنماط حسب احتياجاتك.

هذا هو الرابط إلى GitHub repo الخاص بالشفرة الكاملة: //github.com/sandroarobeli/random-generator