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

โปรแกรม C++ เพื่อสร้างตัวเลขสุ่มโดยใช้การคูณด้วยวิธีพกพา


วิธีการคูณด้วยการพกพาเป็นอีกรูปแบบหนึ่งของตัวสร้างเสริมที่นำมาใช้โดย Marsaglia และ Zaman (1991) ข้อได้เปรียบหลักของวิธีนี้คือการเรียกเลขคณิตจำนวนเต็มของคอมพิวเตอร์อย่างง่าย และนำไปสู่การสร้างลำดับของตัวเลขสุ่มที่มีคาบยาวมากอย่างรวดเร็วมาก ตั้งแต่ประมาณ 260 ถึง 22000000

ใน MWC base b ถูกเลือกให้เท่ากับขนาดคำของคอมพิวเตอร์และตัวคูณ a และ lag r กำหนดโมดูลัส p =ab r -1. ในที่นี้ a ถูกเลือกเพื่อให้โมดูลัสเป็นจำนวนเฉพาะและตัวคูณมีระยะเวลานาน

อัลกอริทึม

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.

โค้ดตัวอย่าง

#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 << "...";
}

ผลลัพธ์

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