一種基於線性反饋位移寄存器的隨機數生成方法

 

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

 

 

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