线性同余法是一个经典的伪随机数发生器,算法如下:
a)将X(0)作为随机数的种子seed;
b)根据递推公式X(n+1) = (a*X(n)+b) % M,依次产生一个随机数序列X(1),X(2),…
其中,M的作用是产生0到M-1之间的伪随机数,因此M的大小直接影响伪随机数序列的周期长短,故M尽可能取比较大的值;
a和b的值越大,产生的伪随机数也越均匀
如果a和M如果互质,产生随机数效果更好。
例如:a.b可定义为int型;
数组X可定义为int型,但要防止a,b取值太大,造成X[i]溢出;
M可取随机数的最大值RAND_MAX(0x7FF);
种子X(0)可依次取1,2,3,…,或取当前时间作为种子,测试你生成的随机数;
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n,i,j,A,b,m,s;
scanf("%d %d %d %d %d",&n,&s,&A,&b,&m);
int *a=(int*)malloc(sizeof(int)*(n+1));
a[0]=s;
for(i=0;i<n;i++)
{
a[i+1]=(a[i]*A+b)%m;
printf("%d ",a[i+1]);
}
return 0;
}