以下介紹一種基於線性反饋位移寄存器的隨機數生成方法,這種算法是某品牌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描述的話是很簡潔的,速度很快,隨機數性質很好,週期也很長。