Computer >> Máy Tính >  >> Lập trình >> C ++

Chương trình C ++ để tạo các số ngẫu nhiên bằng cách sử dụng nhân với phương pháp Carry

Phương pháp nhân với mang là một biến thể của bộ tạo cộng mang được giới thiệu bởi Marsaglia và Zaman (1991). Ưu điểm chính của phương pháp này là nó gọi ra phép tính số nguyên máy tính đơn giản và dẫn đến việc tạo ra các chuỗi số ngẫu nhiên rất nhanh với các chu kỳ lớn, nằm trong khoảng từ 260 đến 22000000.

Trong MWC, cơ sở b được chọn bằng với kích thước từ máy tính và hệ số nhân a và độ trễ r xác định mô-đun p =ab r −1. Ở đây, a được chọn để môđun là số nguyên tố và hệ số nhân có chu kỳ dài.

Thuật toán

Begin
   Declare maximum _sequence _elements, b, r, c[maximum _sequence _elements],
   x[maximum _sequence _elements]
   Read the variables maximum _sequence _elements, b, r
   m = rand() mod b
   c[0] = rand() mod m
   x[0] = rand() mod b
   For I = 1 to maximum_sequence_element, do
      x[i] = (m * x[i - r] + c[i - 1]) mod b
      c[i] = (m * x[i - r] + c[i - 1]) / b
      print the sequence.
   Done.
End.

Mã mẫu

#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 << "The random number sequence is: " << 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 << "...";
}

Đầu ra

The random number sequence is: 177 173 226 221 56 157 84...