كيفية إنشاء أرقام عشوائية أفضل في سطر أوامر Bash

جدول المحتويات:

كيفية إنشاء أرقام عشوائية أفضل في سطر أوامر Bash
كيفية إنشاء أرقام عشوائية أفضل في سطر أوامر Bash
Anonim

يبدو أن إنشاء أرقام عشوائية في bash سهل باستخدام المتغير

$ RANDOM، لكن هل المتغير عشوائي حقًا؟ اكتشف ما قد يمنعك من إنشاء أرقام عشوائية عالية الجودة ، وأكثر من ذلك!

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

يبدو من السهل إنشاء رقم عشوائي في Bash:

توليد رقم عشوائي في باش
توليد رقم عشوائي في باش

لكن هل الرقم عشوائي حقًا؟

هل الرقم العشوائي في باش عشوائي حقًا؟
هل الرقم العشوائي في باش عشوائي حقًا؟

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

يمكننا تهيئة مولد الأرقام العشوائية بقيمة أولية عن طريق تعيين متغير

RANDOMعلى القيمة الأولية المطلوبة. إذن ربما يمكننا توفير رقم عشوائي كبذرة للمولد العشوائي؟

تخصيص رقم عشوائي للمولد العشوائي في Bash
تخصيص رقم عشوائي للمولد العشوائي في Bash

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

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

إذن ، كيف يمكننا إنشاء رقم عشوائي "جيد بما يكفي" ليتم تسميته عشوائيًا حقًا؟

لهذا ، فإننا ، كمصدر وبذرة ، نطلب شيئًا عشوائيًا حقًا أو قريبًا منه حقًا. يمكننا التفكير في استخدام تاريخ اليوم ، لكن هذا ليس عشوائيًا جدًا في الأفكار الثانية. ماذا عن الثواني منذ 00:00:00 بالتوقيت العالمي المنسق في 1 يناير 1970 (تسمى عمومًا "العصر" في دوائر Linux)؟ ربما ، ولكن كل ما يحتاجه المرء هو ملف سجل في مكان ما ويمكن إعادة بناء العصر.

الحل الأفضل هو استخدام أقل الأرقام أهمية لموقت الدقة بالنانو:

أفضل مولد أعداد عشوائية من البذور
أفضل مولد أعداد عشوائية من البذور

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

في المثال ، نأخذ بايت 4 إلى 9 أو 6 أرقام من وقت الحقبة ، كما يتم التعبير عنها بواسطة

التاريخ +٪ N

والإخراج كنتيجة للمجموعة الفرعية التي بدأها

$ (…)هذا يعني أن الحد الأدنى للبذور لدينا هو 0 والحد الأقصى لبذورنا هو 999999. هذا نطاق من مليون رقم فقط.

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

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

مشكلة توليد الانتروبيا العشوائية باستخدام الثواني
مشكلة توليد الانتروبيا العشوائية باستخدام الثواني

يمكننا أن نرى الثواني تدق! لاحظ الأولي 6 > 7 > 8 إلخ.

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

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

موضوع شعبي