一种基于线性反馈位移寄存器的随机数生成方法

 

以下介绍一种基于线性反馈位移寄存器的随机数生成方法,这种算法是某品牌MCU主控的随机数模块生成算法,主控上是电路直接实现的,产生随机数的速度很快,用C代码描述如下:

#define WORD unsigned short
#define DWORD unsigned int

void GetRndValue(WORD wSeed, WORD *pwRndValueBuff, DWORD wSize)
{
	BYTE i;
	DWORD dwCnt;

	for (dwCnt = 0; dwCnt < wSize; dwCnt++)
	{
		for (i = 0; i < 16; i++)
		{
			//移位
			wSeed <<= 1;

			//如果最高位和次高位不相等(异或值为1)
			if ((wSeed & 0x8000) != ((wSeed & 0x4000) << 1))
			{
				wSeed |= 0x0001;
			}
		}

		*pwRndValueBuff = wSeed;
		pwRndValueBuff++;

		printf("\r\n%04X", wSeed);
	}
}

输入一个2字节的随机数种子wSeed(不能为0),然后指定随机数的存放区域pwRndValueBuff,指定生成随机数的个数wSize。

原理很简单,wSeed每次将最高两位的比特进行异或,输出异或运算后的比特,然后左移1位去掉最高位,最低位空出的1位用刚刚生成的随机比特来进行补充,循环往复,每生成满16个随机比特位组合成一个16位(2字节)的随机数。

线性反馈位移寄存器这种方法用C语言来描述要跑16次for循环才生成一个随机数,乍一看还不如用线性同余法,但是这个过程用电路或者FPGA描述的话是很简洁的,速度很快,随机数性质很好,周期也很长。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章