كيفية إنشاء أرقام عشوائية أفضل على سطر أوامر Bash – CloudSavvy IT
يبدو من السهل إنشاء أرقام عشوائية في bash باستخدام bash $RANDOM
المتغيرات ، ولكن هل المتغيرات حقًا عشوائية؟ اكتشف ما الذي قد يمنعك من إنشاء أرقام عشوائية عالية الجودة ، والمزيد!
رقم عشوائي على الجهاز
يبدو من السهل إنشاء رقم عشوائي في Bash:
لكن هل هذا الرقم عشوائي حقًا؟
كما رأينا ، هذا ليس هو الحال. يعتمد مولد الأرقام العشوائي في Bash على القيمة الأولية – القيمة التي تم تمريرها إلى وظيفة توليد الأرقام العشوائية – إذا كانت البذرة هي نفسها ، فسيقوم البذرة دائمًا بإنشاء نفس التسلسل الرقمي العشوائي كما هو موضح في المثال الناتج أعلاه.
يمكننا تهيئة مولد الأرقام العشوائية عن طريق تحديد القيمة الأولية RANDOM
يمكن تغييرها إلى القيمة الأولية المطلوبة. إذن ربما يمكننا توفير رقم عشوائي كبذرة للمولد العشوائي؟
يبدو مفيدًا ، ففي كل مرة نريد إنشاء رقم عشوائي ، سننشئ مسبقًا رقمًا عشوائيًا في مولد الأرقام العشوائية. لكن كل ما فعلناه هو خداع أنفسنا لبعض الوقت. أضفنا طبقة من العمق فقط ، لكن النتيجة كانت متشابهة. الأرقام ليست عشوائية وقد تتأثر بالبذور الثابتة المقدمة مبكراً.
هذه المشكلة تسمى مشكلة جيل “الانتروبيا العشوائية”. كلما استطعنا توليد المزيد من الانتروبيا ، كانت أعدادنا العشوائية أفضل. لا تقتصر هذه المشكلة بالذات على Bash ، فهي موجودة أيضًا في جميع أنظمة الكمبيوتر الأساسية التي تحاول توليد أرقام عشوائية. لذلك ، فإن العشوائية ليست عشوائية حقًا. تستخدم بعض الأنظمة العشوائية الأخرى مجموعات من حركات الماوس وضربات لوحة المفاتيح ومدخلات شبه عشوائية أخرى لزيادة تعقيد تجمع الانتروبيا العشوائية.
إذن كيف يمكننا إنشاء رقم عشوائي “جيد بما يكفي” لتسميته رقمًا عشوائيًا حقيقيًا؟
لهذا ، كمصدر وبذرة ، نحتاج إلى شيء حقيقي أو شبه عشوائي. يمكننا التفكير في استخدام تاريخ اليوم ، لكن هذا ليس عشوائيًا جدًا بالنسبة للفكرة الثانية. ماذا عن عدد الثواني منذ 00:00:00 بالتوقيت العالمي المنسق في 1 يناير 1970 (تسمى عادةً “العصر” في دوائر Linux)؟ ربما يمكن ذلك ، ولكن كل ما هو مطلوب هو ملف سجل في مكان ما ويمكن إعادة بناء العصر.
الحل الأفضل هو استخدام أقل جزء مهم من مؤقت الدقة بالنانو ثانية:
من حيث المبدأ ، هذا ليس مثاليًا أيضًا. وفقًا لعنوان هذه المقالة ، قد تنتمي إلى عنوان “إنشاء أفضل للأرقام العشوائية” ، ولكن حسب التعريف ، فإن الانتروبيا ليست مثالية. دعونا نلقي نظرة فاحصة.
في المثال ، نأخذ بايت من 4 إلى 9 أو 6 أرقام بدءًا من وقت الحقبة ، معبرًا عنها كـ date +%N
وبدأ إخراج المجموعة الفرعية بالأمر التالي $(...)
. هذا يعني أن أصغر بذرة لدينا هي وأكبر بذرتنا هي 999999. هذه ليست سوى مجموعة من مليون رقم.
من حيث المبدأ ، لا يزال من الممكن “اختراق” النظام: يمكن للنظام ببساطة التكرار من خلال كل هذه المليون رقم والحصول على التسلسل الرقمي العشوائي الناتج. على سبيل المثال ، لتوليد مفتاح التشفير ، يجب أن يكون هذا حلاً سيئًا للغاية!
إذا اخترنا رقمًا أصغر ، فستكون مخاطر القيام بذلك أكبر. إذا اخترنا المزيد ، سيصبح الخطر أصغر ، لكن عشوائية “البذور العشوائية” ستصبح أصغر أيضًا. يمكن توضيح ذلك من خلال تضمين عدد الثواني منذ العصر:
يمكننا أن نرى علامة الثواني! انتبه إلى بداية 6> 7> 8 وما إلى ذلك.
من أجل إنشاء أرقام عشوائية قياسية ، على سبيل المثال ، في برنامج اختبار يغير طريقة الاختبار الخاصة به بناءً على بذرة عشوائية ، يكون الحل المعتمد على النانو ثانية كافياً / كافياً. بالنسبة للحلول الأخرى التي قد تتطلب أرقامًا عشوائية ذات جودة أفضل ، قد تكون هناك حاجة إلى حلول تعتمد على الأجهزة الخارجية.
توليد رقم عشوائي حقيقي ليس بالمهمة السهلة. هناك بعض الحلول القائمة على الأجهزة التي قد تقترب أو تحقق إنتروبيا عشوائية حقيقية و / أو توليد رقم عشوائي. على وجه الخصوص ، قد لا تكون الأجهزة القائمة على الأجهزة هي المفتاح لتوليد أرقام عشوائية مثالية.