使用带进位乘法生成随机数的 C++ 程序
乘以进位方法是由Marsaglia和Zaman(1991)引入的加进位生成器的变体。这种方法的主要优点是它调用了简单的计算机整数算法,可以非常快速地生成周期巨大的随机数序列,范围从260到22000000。
在MWC中,b被选择为等于计算机字长,乘数a和滞后r确定模数p=abr-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输出结果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 << "随机数序列为: " << 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 << "..."; }
随机数序列为: 177 173 226 221 56 157 84...