分类: C/C++
2016-09-27 16:34:07
功能要求:
用C语言实现伪随机数生成函数
1. 选定一个24位多项式
2. 起始的seed 为S, 生成一个长度为N byte 的序列,
3. 输出为 一个长度为M=N+3 byte的数组,前3个byte是S,之后是生成的N byte伪随机序
4. S 和M为输入
伪随机接收函数
1. 用同样的伪随机多项式
2. 输入为M byte数组。(测试时由生成函数产生)
3. 从前3个byte中获得seed,并产生M-3 个byte随机序列
4. 将产生的随机序列和输入的随机序列按byte比较,如果全部相等,返回1,否则返回0
生成多项式是F(x)=x^24 + x^7 + x^2 + x + 1
一:伪随机数生成函数的实现
实现伪随机数生成使用梅森旋转算法,算法的原理参考http://blog.csdn.net/ACdreamers/article/details/44656743;
下面是C语言的实现方法:
#include "random.h"
#define RxSuccess 1
#define RxFail 0
void GenRandom (uint32_t seed, uint8_t M ,uint8_t arry[]) //generate Random
{
uint8_t i,j;
uint8_t s23;
uint8_t Byte0,Byte;
for(j=0;j<3;j++)
arry[j]=(seed>>(16-j*8))&0xff; //store seed
for(j=3;j
Byte=0;
for(i=0;i<8;i++)
{
Byte0 = seed&0x01;
s23 = (seed&0x01) ^ ((seed>>17)&0x01) ^ ((seed>>22)&0x01) ^ ((seed>>23)&0x01);
seed = seed >>1 ;
seed = (seed&0x7fffff) | (s23<<23&0x800000);
Byte = Byte|Byte0< }
arry[j] = Byte;
}
}
int RxRandom (uint8_t M ,uint8_t arry[]) //random receive and check
{
uint32_t i,seed;
seed = (arry[0]<<16)|(arry[1]<<8)|(arry[2]);
uint8_t GenArry[600];
uint8_t Sign;
GenRandom (seed,M,GenArry);
for(i=3;i
if(arry[i]!= GenArry[i])
{
Sign = RxFail;
break;
}
else
Sign = RxSuccess;
}
return Sign;
}
void RandomTest()
{
uint8_t ret;
uint8_t arry[550];
GenRandom(0x1088,16,arry);
for(int i=0;i<16;i++)
sysprintf("arry[%d]=%d\n",i,arry[i]);
ret=RxRandom(16 ,arry);
sysprintf("ret=%d\n",ret);
arry[1]=8; //change seed
ret=RxRandom(16 ,arry);
sysprintf("ret=%d\n",ret);
arry[10]=0x60; //change Pseudo-random Sequence
ret=RxRandom(16 ,arry);
sysprintf("ret=%d\n",ret);
}