سؤال

أنا باستخدام srandom() العشوائية() لتوليد أرقام عشوائية في c على نظام يونكس.وأود أن يكون لديك عدة RNGs.كل واحد بالنظر إلى نفس البذور ، يجب إخراج نفس تسلسل.وأود أيضا أن حفظ واستعادة الدولة من كل واحد.وهنا شبة الكود على سبيل المثال:

R1 = new_rng(5); //5 is the seed
R2 = new rng(5); //5 is the seed here, too.
a = R1.random();
b = R1.random();
d = R2.random(); //a == d
s1 = R2.get_state(); //save the state of R2
e = R2.random(); //b == e
R2.set_state(s1); //restore the state of R2
f = R2.random(); //b == f

كيف يمكنني فعل هذا ؟ في بعض الأحيان RNGs سوف شوكة في مختلف المواضيع و أحتاج إلى تكرار حالة RNG عند إنشاء موضوع جديد أيضا.

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

المحلول

استخدم erand48() / nrand48() / jrand48() لتوليد نقطة عائمة مزدوجة الدقة ، عدد صحيح غير سالب طويلة، أو وقعت أرقام عشوائية صحيح طويل، على التوالي. تسمح هذه الوظائف أن يكون لديك العديد من متواليات مستقلة كما هو مطلوب. يتم تمرير الدولة في كحجة ويمكن بسهولة حفظها واستعادتها. وعلاوة على ذلك، يتم تعريف تسلسل وفق المعايير ولن تختلف باختلاف أشواط، حتى على منصات مختلفة.

وبعض إجابات أخرى تشير rand_r() . هذه هي وظيفة الزائل في POSIX.1-2008، الذي يحتوي على هذا ملاحظة:

<اقتباس فقرة>   

وظيفة drand48() يوفر أكثر تفصيلا بكثير عشوائي عدد المولدات.

     

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

     

ويمكن إزالة وظيفة rand_r() في إصدار مستقبلي.

نصائح أخرى

هذه المادة على ميرسين الاعصار . وهناك روابط لعدة تطبيقات في أسفل جدا. (وبعبارة أخرى، تنفيذ PRNG نفسك).

هناك بعض ج مكتبة الإرشاد على مختلف النكهات يونكس:

  • BSD مثل عشوائي ، تحقق initstate/setstate
  • _r المتغيرات (random_r, srandom_r, initstate_r, الخ)
  • rand_r (stdlib.ح)

والتي نكهة تدعمه الهدف الخاص بك UNIX ؟

استخدم rand_r(unsigned *seed) بدلا من srand() وrand(). وبهذه الطريقة يمكنك الحفاظ على عدة بذور عشوائية.

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

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

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