Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Chương trình C++ tạo số ngẫu nhiên bằng phương pháp Multiply with Carry


Phương pháp Multiply-with-carry (MWC) là một biến thể của bộ sinh add-with-carry do Marsaglia và Zaman giới thiệu (1991). Ưu điểm chính của phương pháp này là nó chỉ dùng toán học nguyên máy tính đơn giản và cho phép tạo nhanh các dãy số ngẫu nhiên với chu kỳ cực lớn, từ khoảng 260 đến 220000000.

Trong MWC, cơ số b được chọn bằng kích thước từ máy tính và hệ số nhân a và lag r xác định modulus p = a*br - 1. Ở đây, a được chọn sao cho modulus là số nguyên tố và hệ số nhân có chu kỳ dài.

Thuật toán

Bắt đầu
    Khai báo maximum_sequence_elements, b, r, c[maximum_sequence_elements], x[maximum_sequence_elements]
    Đọc các biến maximum_sequence_elements, b, r
    m = rand() mod b
    c[0] = rand() mod m
    x[0] = rand() mod b
    For I = 1 đến maximum_sequence_element
        x[i] = (m * x[i - r] + c[i - 1]) mod b
        c[i] = (m * x[i - r] + c[i - 1]) / b
    In dãy số.
Kết thúc.

Mã ví dụ

#include <iostream>
using namespace std;

int main(int argc, char **argv) {
    int max_Seq_Elements = 7;
    int b = 300;
    int m = rand() % b;
    int r = 1;
    int c[max_Seq_Elements];
    int x[max_Seq_Elements];
    c[0] = rand() % m;
    x[0] = rand() % b;
    cout << "Dãy số ngẫu nhiên là: " << x[0];
    for (int i = 1; i < max_Seq_Elements; i++) {
        x[i] = (m * x[i - r] + c[i - 1]) % b;
        c[i] = (m * x[i - r] + c[i - 1]) / b;
        cout << " " << x[i];
    }
    cout << "...";
}

Kết quả đầu ra

Dãy số ngẫu nhiên là: 177 173 226 221 56 157 84...