هل توجد مولدات أرقام عشوائية عديمة الجنسية؟

StackOverflow https://stackoverflow.com/questions/203382

  •  03-07-2019
  •  | 
  •  

سؤال

هل هناك فرق بين إنشاء أرقام متعددة باستخدام مولد أرقام عشوائي واحد (RNG) مقابل إنشاء رقم واحد لكل مولد والتخلص منه؟هل يقوم كلا التطبيقين بإنشاء أرقام عشوائية بنفس القدر؟هل هناك فرق بين RNGs العادية وRNG الآمنة لهذا؟

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

تحديث:هذا السؤال يتعلق هل المجموعة الفرعية من التسلسل العشوائي عشوائية أيضًا؟

هل كانت مفيدة؟

المحلول

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

تسلسل القيم العشوائية محدود ويتكرر.

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

تتمتع معظم المولدات بفترة طويلة بما يكفي بحيث لا يلاحظ أحد تكرارها.سينتج مولد الأرقام العشوائية 48 بت عدة مئات من مليارات الأرقام العشوائية قبل أن يتكرر - مع (AFAIK) أي قيمة أولية 32 بت.

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

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

قبل كل شيء، لا تحاول أبدًا كتابة منشئ الأرقام العشوائية الخاص بك.المولدات المدمجة في معظم مكتبات اللغات جيدة حقًا.وخاصة الحديثة التي تستخدم أكثر من 32 بت.

تحتوي بعض توزيعات Linux على /dev/random و /dev/urandom جهاز.يمكنك قراءتها مرة واحدة لإنشاء منشئ الأرقام العشوائية لتطبيقك.تحتوي هذه على قيم عشوائية إلى حد ما، ولكنها تعمل عن طريق "تجميع الضوضاء" من أحداث النظام العشوائية.استخدمها باعتدال بحيث يكون هناك الكثير من الأحداث العشوائية بين الاستخدامات.

نصائح أخرى

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

وهذا ينطبق بشكل خاص مع معظم مولدات لقد استعملت، والتي تستخدم في الوقت الحالي في ميلي ثانية كبذرة.

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

هذه الأنظمة لا تحتاج إلى الحفاظ على الدولة.ربما ليس ما كنت تبحث عنه.

كما لاحظ آخرون، فإن أنظمة البرمجيات ليست سوى شبه عشوائية، و يجب الحفاظ على الدولة.

الحل الوسط هو استخدام RNG القائم على الأجهزة لتوفير مجمع الإنتروبيا (الحالة المخزنة) والذي يتم إتاحته لبذر PRNG.ويتم ذلك بشكل واضح تمامًا في تطبيق Linux لـ /dev/random [3] و /dev/urandom [4].

هذه بعض الحجج حول مدى عشوائية المدخلات الافتراضية لمجموعة الإنتروبيا /dev/random.


الحواشي:

  1. modulo أي مشاكل في فهمنا للفيزياء
  2. لأنك تنتظر عملية عشوائية
  3. يتميز /dev/random بإمكانية الوصول المباشر إلى مجموعة الإنتروبيا المصنفة من مصادر مختلفة يُعتقد أنها عشوائية حقًا أو تقريبًا، ويتم حظرها عند استنفاد الإنتروبيا
  4. /dev/urandom يشبه /dev/random، ولكن عندما يتم استنفاد الإنتوبيا، يتم استخدام تجزئة التشفير مما يجعل مجمع الإنتروبيا بشكل فعال PRNG ذو حالة

إذا قمت بإنشاء RNG وتوليد رقم عشوائي واحد من ذلك، ثم تجاهل RNG، وعدد التي تم إنشاؤها فقط عشوائي مثل البذور تستخدم لبدء RNG.

وسيكون أفضل بكثير لإنشاء RNG واحد ورسم أعداد كثيرة منه.

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

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

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

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

والجدير بالذكر أن هاسكل هي لغة التي تحاول القضاء كليا دولة قابلة للتغيير. من أجل التوفيق بين هذا الهدف مع متطلبات الصلبة مثل IO (الذي يتطلب شكلا من أشكال التحولية)، يجب أن تستخدم الكائنات الدقيقة الاحاديه الخلية الخيط الدولة من حساب واحد إلى آخر. وبهذه الطريقة، هاسكل تنفذ عدد المولدات شبه عشوائي لها. بالمعنى الدقيق للكلمة، وتوليد أرقام عشوائية غير عملية جليل بطبيعتها، ولكن هاسكل غير قادرة على إخفاء هذه الحقيقة عن طريق تحريك الدولة "طفرة" في (>>=) عملية الربط.

وهذا ربما يبدو قليلا مجردة، وأنه لا يجيب حقا سؤالك تماما، ولكن أعتقد أنه لا يزال المعمول به. من الناحية النظرية، فإنه من المستحيل للعمل مع RNG دون إشراك الدولة. بغض النظر، هناك التقنيات التي يمكن استخدامها لتخفيف هذا التفاعل وجعله <م> تظهر وكأن العملية برمتها ذات طبيعة عديمي الجنسية.

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

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

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

وPRNGs الآمنة هي أبطأ بكثير، وربما تتطلب المكتبات للقيام عملية من الدقة التعسفي، وبريماليتي الاختبار، الخ الخ ...

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top