কম্পিউটার টিউটোরিয়াল

C++ প্রোগ্রাম: লিনিয়ার কনগ্রুয়েনশিয়াল জেনারেটর বাস্তবায়ন সুডো র‍্যান্ডম নম্বর জেনারেশনের জন্য


লিনিয়ার কনগ্রুয়েনশিয়াল জেনারেটর (Linear Congruential Generator) সুডো র‍্যান্ডম নম্বর জেনারেটরের একটি খুব সহজ উদাহরণ। এটি সবচেয়ে পুরনো এবং পরিচিত সুডো র‍্যান্ডম নম্বর জেনারেটর অ্যালগরিদম। এই পদ্ধতিতে ব্যবহৃত ফাংশন:

Xₙ₊₁ = (aXₙ + C) mod m

যেখানে X হলো সুডো র‍্যান্ডম ভ্যালুর সিকোয়েন্স, এবং

m, 0 < m — "মডুলাস"
a, 0 < a < m — "মাল্টিপ্লায়ার"
c, 0 < c < m — "ইনক্রিমেন্ট"
X₀, 0 < x₀ < m — "সিড" বা "স্টার্ট ভ্যালু"

এগুলো ইন্টিজার কনস্ট্যান্ট যা জেনারেটর নির্দিষ্ট করে।

এই পদ্ধতির সুবিধা হল উপযুক্ত প্যারামিটার বেছে নিলে পিরিয়ড জানা থাকে এবং দীর্ঘ হয়।

অ্যালগরিদম

শুরু
    mRND ক্লাস ঘোষণা করুন
    Seed(number) ফাংশন তৈরি করুন
        _seed = number অ্যাসাইন করুন
    mRND কনস্ট্রাক্টর তৈরি করুন
        _seed(0), a(0), c(0), m(2147483648) ঘোষণা করুন
    rnd() ফাংশন তৈরি করুন
        _seed = (a * _seed + c) % m ফেরত দাও
    a, c, m, _seed ঘোষণা করুন
    শেষ
    mRND থেকে ইনহেরিট করে MS_RND সাবক্লাস ঘোষণা করুন
    কনস্ট্রাক্টর তৈরি করুন
        a, c পড়ুন
    rnd() ফাংশন তৈরি করুন
        mRND::rnd() >> 16 ফেরত দাও
    끝난
    mRND থেকে ইনহেরিট করে BSD_RND সাবক্লাস ঘোষণা করুন
    কনস্ট্রাক্টর তৈরি করুন
        a, c পড়ুন
    rnd() ফাংশন তৈরি করুন
        mRND::rnd() ফেরত দাও
    끝난
    x = 0 থেকে 6 পর্যন্ত
        MS_RAND প্রিন্ট করুন
    x = 0 থেকে 6 পর্যন্ত
        BSD_RAND প্রিন্ট করুন
    끝난
শেষ

উদাহরণ কোড

#include <iostream>
using namespace std;

class mRND {
public:
    void seed(unsigned int s) {
        _seed = s;
    }
protected:
    mRND() : _seed(0), a(0), c(0), m(2147483648) { }
    int rnd() {
        return (_seed = (a * _seed + c) % m);
    }
    int a, c;
    unsigned int m, _seed;
};

class MS_RND: public mRND {
public:
    MS_RND() {
        a = 214013;
        c = 2531011;
    }
    int rnd() {
        return mRND::rnd() >> 16;
    }
};

class BSD_RND: public mRND {
public:
    BSD_RND() {
        a = 1016404597;
        c = 12345;
    }
    int rnd() {
        return mRND::rnd();
    }
};

int main(int argc, char* argv[]) {
    BSD_RND bsd_rnd;
    MS_RND ms_rnd;
    cout << "MS RAND:" << endl << "-----------" << endl;
    for (int x = 0; x < 6; x++)
        cout << ms_rnd.rnd() << endl;
    cout << endl << "BSD RAND:" << endl << "-------------" << endl;
    for (int x = 0; x < 6; x++)
        cout << bsd_rnd.rnd() << endl;
    return 0;
}

আউটপুট

MS RAND:
-------
38
7719
21238
2437
8855
11797

BSD RAND:
---------
12345
1915290694
1005338679
629284700
741596485
1834373826
  1. সি/সি++ প্রোগ্রামে ট্রায়্যাঙ্গুলার ম্যাচস্টিক নম্বর বের করা

  2. C++ প্রোগ্রাম: হেক্সাডেসিমেল থেকে ডেসিমেল কনভার্সন

  3. C++-এ DAG-এর জন্য র‍্যান্ডম লিনিয়ার এক্সটেনশন (Random Linear Extension) তৈরি করা

  4. C++-এ ভিজিনার সাইফার (Vigenere Cipher) ইমপ্লিমেন্টেশন