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

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

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

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

من حيث المبدأ ، حتى هذه ليست مثالية. قد تندرج تحت عنوان "إنشاء رقم عشوائي أفضل" حسب عنوان هذه المقالة ، لكن الانتروبيا ليست مثالية من حيث التعريف. دعونا ننظر إلى هذا عن قرب.
في المثال ، نأخذ بايت 4 إلى 9 أو 6 أرقام من وقت الحقبة ، كما يتم التعبير عنها بواسطة
التاريخ +٪ N
والإخراج كنتيجة للمجموعة الفرعية التي بدأها
$ (…)هذا يعني أن الحد الأدنى للبذور لدينا هو 0 والحد الأقصى لبذورنا هو 999999. هذا نطاق من مليون رقم فقط.
من حيث المبدأ ، لا يزال من الممكن "اختراق" هذا النظام: يمكن للمرء ببساطة التنقل بين كل تلك المليون رقم والحصول على تسلسل الأرقام العشوائي الناتج عن ذلك. بالتأكيد سيكون حلاً ضعيفًا جدًا لتوليد مفتاح التشفير ، على سبيل المثال!
إذا حددنا أرقامًا أقل ، فستزداد مخاطر ذلك. إذا اخترنا أكثر ، فإن الخطر يصبح أصغر ، لكن "البذرة العشوائية" تصبح أقل عشوائية أيضًا. يمكن تمثيل ذلك من خلال تضمين الثواني منذ العصر:

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