以下介绍一种基于线性反馈位移寄存器的随机数生成方法,这种算法是某品牌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描述的话是很简洁的,速度很快,随机数性质很好,周期也很长。