线性同余法求伪随机数序列

利用线性同余法求随机数,也可称作利用线性同余法求伪随机序列.

线性同余法是一种求随机数的方法,它所求得得随机数的序列是成周期性,同时它是根据公式计算求得得随机数并非是由硬件产生的随机数所以被称作伪随机序列.随机序列的循环周期的大小取决于相关参数的选取,如果选取参数得当,可以将此循环周期拉得很长.

以下算法是输入相关参数后,计算并产生随机数,然后输出循环周期的长度.

线性同余法公式:

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;
}

 

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值