رأس عشوائي في C++ | المجموعة 1 (المولدات)

رأس عشوائي في C++ | المجموعة 1 (المولدات)

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

    مولدات : الكائنات التي تولد أرقامًا موزعة بشكل موحد.
  • توزيعات : الكائنات التي تحول تسلسلات الأرقام التي تم إنشاؤها بواسطة المولد إلى تسلسلات من الأرقام التي تتبع توزيع متغير عشوائي محدد مثل عادي أو ثنائي الحد.

مولدات

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

محركات الأرقام العشوائية

1. محرك متطابق خطي : إنه أبسط محرك في مكتبة STL يقوم بإنشاء أرقام صحيحة عشوائية غير موقعة. يلي: 

 x = (a.x +c) mod m Where x= current state value a = multiplier parameter ; if m is not zero this parameter should be lower than m. c = increment parameter ; if m is not zero this parameter should be lower than m. m = modulus parameter  
    عامل التشغيل (): يولد رقم عشوائي. دقيقة: إنه يعطي الحد الأدنى للقيمة التي يتم إرجاعها بواسطة عامل التشغيل العضو (). الأعلى: إنه يعطي الحد الأقصى للقيمة التي يتم إرجاعها بواسطة عامل التشغيل العضو ().
C++
   // C++ program to illustrate   // the use of operator() max and min   // in linear_congruential_engine   #include          #include         #include         using     namespace     std  ;   // driver program   int     main     ()   {      // finds the time between the system clock      //(present time) and clock's epoch      unsigned     seed     =     chrono  ::  system_clock  ::  now  ().  time_since_epoch  ().  count  ();          // minstd_rand0 is a standard      // linear_congruential_engine      minstd_rand0     generator     (  seed  );             // generates the random number      cout      < <     generator  ()      < <     ' is a random number between '  ;          //use of min and max functions      cout      < <     generator  .  min  ()      < <     ' and '      < <     generator  .  max  ();          return     0  ;   }   

الإخراج:

211182246 is a random number between 1 and 2147483646 

2. محرك Mersenne_twister: إنه محرك أرقام عشوائي يعتمد على خوارزمية Mersenne Twister. وينتج أرقامًا عشوائية صحيحة غير موقعة عالية الجودة في الفاصل الزمني [0 (2^w)-1].
حيث "w" هو حجم الكلمة: عدد البتات لكل كلمة في تسلسل الحالة. 

    عامل التشغيل (): يقوم بإنشاء رقم عشوائي. دقيقة: تقوم بإرجاع الحد الأدنى للقيمة التي يتم إرجاعها بواسطة مشغل العضو () والتي تكون دائمًا صفرًا بالنسبة إلى Mersenne_twister_engine. الأعلى: تقوم بإرجاع الحد الأقصى للقيمة التي يتم إرجاعها بواسطة مشغل العضو () والتي بالنسبة إلى Mersenne_twister_engine هي 2w-1 (حيث w هو حجم الكلمة).
C++
   // C++ program to illustrate the use of    // operator() min and max   // in mersenne_twister_engine    #include          #include         #include         using     namespace     std  ;   // Driver program   int     main     ()   {          // finds the time between the system clock      // (present time) and clock's epoch      unsigned     seed     =     chrono  ::  system_clock  ::  now  ().  time_since_epoch  ().  count  ();          // mt19937 is a standard mersenne_twister_engine      mt19937     generator     (  seed  );             // use of operator()       cout      < <     generator  ()      < <     ' is a random number between '  ;          // use of max and min      cout      < <     generator  .  min  ()      < <     ' and '      < <     generator  .  max  ();          return     0  ;   }   

الإخراج:

3348201622 is a random number between 0 and 4294967295 

3. محرك الطرح مع_الحمل: إنه محرك مولد أرقام عشوائية زائفة ينتج أرقامًا صحيحة غير موقعة.
الخوارزمية المستخدمة متخلفة مولد فيبوناتشي مع تسلسل حالة من العناصر الصحيحة r بالإضافة إلى قيمة تحمل واحدة.

    عامل التشغيل () : يقوم بإنشاء رقم عشوائي. الأعلى : تقوم بإرجاع القيمة القصوى التي يتم إرجاعها بواسطة مشغل العضو () وهي (2^w)-1 لمحرك subtract_with_carry_engine حيث يكون "w" هو حجم الكلمة. دقيقة : تقوم بإرجاع الحد الأدنى للقيمة التي يتم إرجاعها بواسطة مشغل العضو () والذي يكون دائمًا صفرًا لـ subtract_with_carry_engine.
C++
   // C++ program to illustrate the use of    // operator() min and max   // in subtract_with_carry_engine   #include          #include         #include         using     namespace     std  ;   // Driver program   int     main     ()   {          // finds the time between the system clock      // (present time) and clock's epoch      unsigned     seed     =     chrono  ::  system_clock  ::  now  ().  time_since_epoch  ().  count  ();          subtract_with_carry_engine   <  unsigned       24       10       24  >     generator     (  seed  );          // use of operator()      cout      < <     generator  ()      < <     ' is a random number between '  ;          // use of min and max      cout      < <     generator  .  min  ()      < <     ' and '      < <     generator  .  max  ();      return     0  ;   }   

الإخراج:

8606455 is a random number between 0 and 16777215 


ثانيا. مولد رقم عشوائي : هو مولد أرقام عشوائية ينتج أرقام عشوائية غير حتمية.

    Random_device : إنه مولد الأرقام العشوائية الحقيقية. عامل التشغيل () : يقوم بإرجاع رقم عشوائي جديد. دقيقة : تقوم بإرجاع الحد الأدنى للقيمة التي يتم إرجاعها بواسطة عامل التشغيل العضو () والتي تكون دائمًا صفرًا بالنسبة إلى Random_device. الأعلى : تقوم بإرجاع القيمة القصوى التي يتم إرجاعها بواسطة عامل التشغيل العضو ().
C++
   // C++ program to illustrate the use of    // operator() min and max   // in random_device    #include          #include         using     namespace     std  ;   //Driver program   int     main     ()   {      random_device     example  ;          cout      < <     'default random_device characteristics:'      < <     endl  ;          // use of min      cout      < <     'minimum: '      < <     example  .  min  ()      < <     endl  ;          // use of max      cout      < <     'maximum: '      < <     example  .  max  ()      < <     endl  ;          // use of entropy      cout      < <     'entropy: '      < <     example  .  entropy  ()      < <     endl  ;          // use of operator()      cout      < <     'a random number: '      < <     example  ()      < <     endl  ;          return     0  ;   }   

الإخراج:

default random_device characteristics: minimum: 0 maximum: 4294967295 entropy: 0 a random number: 3705944883 

ثالثا. محركات الأرقام العشوائية الزائفة (المثيلات) : هذه هي المثيلات الخاصة لمحركات المولدات والمحولات:

محركات الأرقام العشوائية الزائفة (المثيلات)

1. default_random_engine : هذه فئة محرك أرقام عشوائية تقوم بإنشاء أرقام عشوائية زائفة.

    دقيقة : تقوم بإرجاع الحد الأدنى للقيمة المقدمة من قبل المشغل (). الأعلى : تقوم بإرجاع القيمة القصوى التي قدمها عامل التشغيل (). عامل التشغيل () : يقوم بإرجاع رقم عشوائي جديد.
    تقوم الدالة بتغيير الحالة الداخلية بحالة تقوم بتعديل قيمة الحالة وفقًا للخوارزمية المحددة:
 x= (a.x + c)mod m Where x= current state value a and c = respective class template parameters m = class template parameter  
C++
   // C++ program to illustrate the use of    // operator() min and max    // in default_random_engine    #include             #include            #include            using     namespace     std  ;          // Driver program    int     main     ()      {             // finds the time between the system clock       // (present time) and clock's epoch       unsigned     seed     =     chrono  ::  system_clock  ::  now  ().  time_since_epoch  ().  count  ();             // minstd_rand0 is a standard linear_congruential_engine       minstd_rand0     generator     (  seed  );             // generates the random number       cout      < <     generator  ()      < <     ' is a random number between '  ;             // Use of min and max       cout      < <     generator  .  min  ()      < <     ' and '      < <     generator  .  max  ();             return     0  ;      }      

الإخراج:

201066682 is a random number between 1 and 2147483646 

2. مينستد_راند: يقوم بإنشاء أرقام عشوائية زائفة؛ إنه مشابه لـ مولد التطابق الخطي

    عامل التشغيل (): يقوم بإرجاع رقم عشوائي جديد. تقوم الدالة بتغيير الحالة الداخلية بحالة تقوم بتعديل قيمة الحالة وفقًا للخوارزمية التالية:
x = (a.x + c) mod m where x= current state value a c and m=class template parameter 
    دقيقة: تقوم بإرجاع الحد الأدنى للقيمة المقدمة من قبل المشغل العضو (). الأعلى: تقوم بإرجاع القيمة القصوى المقدمة من مشغل العضو () والتي تكون بالنسبة للمحرك الخطي_المتوافق (modulus-1).
C++
   // C++ program to illustrate    // the use of operator() max and min    // in minstd_rand    #include             #include            #include            using     namespace     std  ;          //Driver program    int     main     ()      {             // finds the time between the system clock       //(present time) and clock's epoch       unsigned     seed     =     chrono  ::  system_clock  ::  now  ().  time_since_epoch  ().  count  ();             // minstd_rand0 is a standard       //linear_congruential_engine       minstd_rand0     generator     (  seed  );             // use of operator()       cout      < <     generator  ()      < <     ' is a random number between '  ;             //use of max and min       cout      < <     generator  .  min  ()      < <     ' and '      < <     generator  .  max  ();             return     0  ;      }   

الإخراج:

489592737 is a random number between 1 and 2147483646 

3. mt19937: إنه مولد Mersenne Twister 19937. إنه مولد عشوائي زائف لأرقام 32 بت بحجم حالة 19937 بت.

    عامل التشغيل (): فإنه يولد رقم عشوائي. تقوم الوظيفة بتغيير الحالة الداخلية بحالة واحدة باستخدام خوارزمية انتقال تؤدي إلى تغيير في العنصر المحدد. الأعلى: تقوم بإرجاع القيمة القصوى التي قدمها عامل التشغيل (). دقيقة: تقوم بإرجاع الحد الأدنى للقيمة المقدمة من قبل المشغل ().
     
C++
   // C++ program to illustrate the    // use of operator()min and max    // in mt19937    #include             #include            #include            using     namespace     std  ;          // Driver program    int     main     ()      {             // finds the time between the system clock       //(present time) and clock's epoch       unsigned     seed     =     chrono  ::  system_clock  ::  now  ().  time_since_epoch  ().  count  ();             // mt19937 is a standard       //mersenne_twister_engine       mt19937     generator     (  seed  );             //use of operator()       cout      < <     generator  ()      < <     ' is a random number between '  ;             //use of max and min       cout      < <     generator  .  min  ()      < <     ' and '      < <     generator  .  max  ();             return     0  ;      }   

الإخراج:

1445431990 is a random number between 0 and 4294967295 

4.ranlux24_base: إنه مولد أساسي Ranlux 24. إنه مولد عشوائي زائف للطرح مع الحمل لأرقام 24 بت يستخدم بشكل عام كمحرك أساسي لمولد ranlux24.

    عامل التشغيل (): يقوم بإرجاع رقم عشوائي جديد.
    تقوم الدالة بتغيير الحالة الداخلية عن طريق استدعاء خوارزمية الانتقال الخاصة بها والتي تطبق عملية الطرح مع الحمل على العنصر. الأعلى: تقوم بإرجاع القيمة القصوى التي قدمها عامل التشغيل (). دقيقة: تقوم بإرجاع الحد الأدنى للقيمة المقدمة من قبل المشغل ().
C++
   // C++ program to illustrate    // the use of operator()min and max    // in ranlux24_base    #include             #include            #include            using     namespace     std  ;          //Driver program    int     main     ()      {             // finds the time between the system clock       //(present time) and clock's epoch       unsigned     seed     =     chrono  ::  system_clock  ::  now  ().  time_since_epoch  ().  count  ();         subtract_with_carry_engine   <  unsigned    24    10    24  >     generator     (  seed  );             //use of operator()       cout      < <     generator  ()      < <     ' is a random number between '  ;             //use of max and min       cout      < <     generator  .  min  ()      < <     ' and '      < <     generator  .  max  ();             return     0  ;      }      

الإخراج:

7275352 is a random number between 0 and 16777215 

ينطبق التنسيق المماثل على الأمثلة الأخرى.

رابعا. محولات المحرك

رأس عشوائي في C++ | المجموعة 1 (المولدات)

1.discover_block_engine: إنه قالب فئة محول المحرك الذي يتكيف مع محرك مولد الأرقام العشوائية الزائفة اكتب باستخدام عناصر "r" فقط من كل كتلة من عناصر "p" من التسلسل الذي ينتجه مع تجاهل الباقي.
يحتفظ المحول بعدد داخلي لعدد العناصر التي تم إنتاجها في الكتلة الحالية.

المولدات القياسية ranlux24 و رانلوكس48 التكيف أ subtract_with_carry_engine باستخدام هذا المحول.

    عامل التشغيل (): يقوم بإرجاع رقم عشوائي جديد. الأعلى: تقوم بإرجاع القيمة القصوى التي قدمها عامل التشغيل (). دقيقة: تقوم بإرجاع الحد الأدنى للقيمة المقدمة من قبل المشغل ().
C++
   // C++ program to illustrate    // the use of operator()min and max    // in the discard_block_engine    #include             #include            #include            using     namespace     std  ;          //Driver program    int     main     ()      {             // finds the time between the system clock       //(present time) and clock's epoch       unsigned     seed     =     chrono  ::  system_clock  ::  now  ().  time_since_epoch  ().  count  ();             // ranlux24 is a standard instantiation       //of discard_block_engine:       ranlux24     generator     (  seed  );             //use of operator()       cout      < <     generator  ()      < <     ' is a random number between '  ;             //use of max and min       cout      < <     generator  .  min  ()      < <     ' and '      < <     generator  .  max  ();             return     0  ;      }      

الإخراج:

8132325 is a random number between 0 and 16777215 

2. محرك البتات المستقل: إنه قالب فئة محول المحرك الذي يتكيف مع محرك مولد الأرقام العشوائية الزائفة اكتب لإنتاج أرقام عشوائية بعدد محدد من البتات (w).

    عامل التشغيل (): يقوم بإرجاع رقم عشوائي جديد.
    تستدعي خوارزمية انتقال المحرك عضو المشغل () الخاص بالمحركات الأساسية عدة مرات حسب الحاجة للحصول على ما يكفي من البتات المهمة لإنشاء قيمة عشوائية. الأعلى: تقوم بإرجاع القيمة القصوى التي قدمها عامل التشغيل (). دقيقة: تقوم بإرجاع الحد الأدنى للقيمة المقدمة من قبل المشغل ().
C++
   // C++ program to illustrate    // the use of operator()min and max    // in independent_bits_engine    #include             #include                // It imports the symbol names in    // std namespace and possibly in Global namespace.    #include            #include            using     namespace     std  ;          //Driver program    int     main     ()      {             // finds the time between the system clock       //(present time) and clock's epoch       unsigned     seed     =     chrono  ::  system_clock  ::  now  ().  time_since_epoch  ().  count  ();             //use of independent_bits_engine       independent_bits_engine   <  mt19937    64    uint_fast64_t  >     generator     (  seed  );             //use of operator()       cout      < <     generator  ()      < <     ' is a random number between '  ;             //use of max and min       cout      < <     generator  .  min  ()      < <     ' and '      < <     generator  .  max  ();             return     0  ;      }      

الإخراج:

13551674127875514537 is a random number between 0 and 184467 

3. محرك النظام العشوائي: إنه قالب فئة محول المحرك الذي يتكيف مع محرك مولد الأرقام العشوائية الزائفة اكتب بحيث يتم تسليم الأرقام في تسلسل مختلف.
يحتفظ الكائن بمخزن مؤقت للأرقام التي تم إنشاؤها بواسطة k داخليًا وعند الطلب يقوم بإرجاع رقم محدد عشوائيًا داخل المخزن المؤقت مع استبداله بقيمة تم الحصول عليها من محركه الأساسي.

    عامل التشغيل (): يقوم بإرجاع رقم عشوائي جديد.
    تختار خوارزمية انتقال المحرك قيمة في الجدول الداخلي (والتي يتم إرجاعها بواسطة الدالة) وتستبدلها بقيمة جديدة تم الحصول عليها من محركها الأساسي. الأعلى: تقوم بإرجاع القيمة القصوى التي قدمها عامل التشغيل (). دقيقة: تقوم بإرجاع الحد الأدنى للقيمة المقدمة من قبل المشغل ().
C++
   // C++ program to illustrate    // the use of operator()min and max    // in shuffle_order_engine    #include             #include            #include            using     namespace     std  ;          int     main     ()      {             // finds the time between the system clock       //(present time) and clock's epoch       unsigned     seed     =     chrono  ::  system_clock  ::  now  ().  time_since_epoch  ().  count  ();             // ranlux24 is a standard instantiation       // of discard_block_engine:       ranlux24     generator     (  seed  );             //use of operator()       cout      < <     generator  ()      < <     ' is a random number between '  ;             //use of max and min       cout      < <     generator  .  min  ()      < <     ' and '      < <     generator  .  max  ();             return     0  ;      }      

الإخراج:

9213395 is a random number between 0 and 16777215 
إنشاء اختبار