วิธีการคูณด้วยการพกพาเป็นอีกรูปแบบหนึ่งของตัวสร้างเสริมที่นำมาใช้โดย 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...