Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

캐리 방법으로 곱하기를 사용하여 난수를 생성하는 C++ 프로그램

<시간/>

multi-with-carry 방법은 Marsaglia와 Zaman(1991)이 도입한 add-with-carry 생성기의 변형입니다. 이 방법의 주요 이점은 간단한 컴퓨터 정수 산술을 호출하고 약 260에서 22000000까지의 엄청난 주기를 갖는 일련의 난수를 매우 빠르게 생성할 수 있다는 것입니다.

MWC에서 기본 b는 컴퓨터 단어 크기와 같도록 선택되고 승수 a 및 지연 r은 계수 p =ab r 을 결정합니다. -1. 여기에서는 계수가 소수이고 승수가 긴 주기를 갖도록 선택됩니다.

알고리즘

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...