利用线性同余法求随机数,也可称作利用线性同余法求伪随机序列.
线性同余法是一种求随机数的方法,它所求得得随机数的序列是成周期性,同时它是根据公式计算求得得随机数并非是由硬件产生的随机数所以被称作伪随机序列.随机序列的循环周期的大小取决于相关参数的选取,如果选取参数得当,可以将此循环周期拉得很长.
以下算法是输入相关参数后,计算并产生随机数,然后输出循环周期的长度.
线性同余法公式:
a,b,m是随机数产生器设定的常数.
mod:表示对m取余,即%m.
x(0)被称为种子,x(n)与x(n-1)是随着运算进行是变化的
关于a,b,m的取值,决定着随机序列周期的长短,满足以下条件后,可以让序列周期长度达到m,各个随机数不重合,且这些随机数序列包含了0到m的所有数.
1. b和m互质,即公约数只有1
2. M的所有质因子的积能够整除a-1,如若m是3的倍数,a-1也是3的倍数
3. a,b,x0 都要比M小
4. a,b是正整数
例如:a=6 x0=4 b=7 m=25
a=5 x0=6 b=15 m=16
注意:一般应用中为了保证随机数序列尽量不重复,一般选取计算时候的时钟作为种子来开始计算
代码实现:
输入参数:a,x0,b,m
输出一个完整序列中的所有随机数,并输出此随机数序列的长度.
如:输入:
a=5
x0=6
b=15
m=16
输出:
13 0 15 10 1 4 3 14 5 8 7 2 9 12 11 6
length of the sequence is 16
代码:
#include <stdio.h>
int CalRandNum(int a,int x0,int b,int m)
{
int xn;
xn = (a*x0 + b)%m;
return xn;
}
int main()
{
int a,b,m,x0,xn,x1;
int i = 0;
printf("a=");
scanf("%d",&a);
printf("x0=");
scanf("%d",&x0);
printf("b=");
scanf("%d",&b);
printf("m=");
scanf("%d",&m);
x1 = CalRandNum(a, x0, b, m);
while(xn!=x1){
if(i==0){
xn = x1;
}
printf("%d ",xn);
i++;
xn = CalRandNum(a, xn, b, m);
}
printf("\r\nlength of the sequence is %d\r\n",i);
return 0;
}