Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรม C++ ตัวสร้างตัวเลขสุ่มแบบ Linear Congruential Generator (LCG)


ตัวสร้างตัวเลขสุ่มแบบ Linear Congruential Generator

ตัวสร้างแบบ Linear Congruential Generator เป็นตัวอย่างที่เรียบง่ายมากของตัวสร้างตัวเลขสุ่ม เป็นหนึ่งในอัลกอริทึม pseudorandom number generator ที่เก่าและรู้จักมากที่สุด ฟังก์ชันที่ใช้ในวิธีนี้คือ

X_{n+1} = (aX_n + C) mod m

โดยที่ X คือลำดับของค่า pseudorandom และ

m, 0 < m — "modulus"
a, 0 < a < m — "multiplier"
c, 0 < c < m — "increment"
X₀, 0 < x₀ < m — "seed" หรือ "start value"
เป็นค่าคงที่จำนวนเต็มที่ระบุตัวสร้าง

ประโยชน์ของวิธีนี้คือ ด้วยการเลือกพารามิเตอร์ที่เหมาะสม ช่วงเวลา (period) จะทราบและยาว

อัลกอริทึม

เริ่มต้น
  ประกาศคลาส mRND
  สร้างฟังก์ชัน Seed(number) กำหนดตัวแปร _seed = number
  สร้าง constructor mRND ประกาศ _seed(0), a(0), c(0), m(2147483648)
  สร้างฟังก์ชัน rnd() คืนค่า _seed = (a * _seed + c) mod m
  ประกาศ a, c, m, _seed
  Done
  ประกาศคลาสย่อย MS_RND 繼承จาก mRND
  สร้าง constructor อ่านตัวแปร a, c
  สร้างฟังก์ชัน rnd() คืนค่า mRND::rnd() ขวา 16
  ประกาศคลาสย่อย BSD_RND 繼承จาก mRND
  สร้าง constructor อ่านตัวแปร a, c
  สร้างฟังก์ชัน rnd() คืนค่า mRND::rnd()
  For x = 0 ถึง 6 พิมพ์ MS_RAND
  For 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