Chinaunix首页 | 论坛 | 博客
  • 博客访问: 24112
  • 博文数量: 12
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2016-08-26 15:59
文章分类

全部博文(12)

文章存档

2017年(3)

2016年(9)

我的朋友
最近访客

分类: C/C++

2016-09-27 16:34:07

功能要求

C语言实现伪随机数生成函数

1.       选定一个24位多项式

2.       起始的seed S, 生成一个长度为N byte 的序列,

3.       输出为 一个长度为M=N+3 byte的数组,前3byteS,之后是生成的N byte伪随机序

4.       S M为输入

 

伪随机接收函数

1  用同样的伪随机多项式

2  输入为M byte数组。(测试时由生成函数产生)

3  从前3byte中获得seed,并产生M-3 byte随机序列

4  将产生的随机序列和输入的随机序列按byte比较,如果全部相等,返回1,否则返回0

一:伪随机数生成函数的实现
实现伪随机数生成使用梅森旋转算法算法的原理参考http://blog.csdn.net/ACdreamers/article/details/44656743;

     生成多项式是F(x)=x^24 + x^7 + x^2 + x + 1


下面是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);
}


阅读(2540) | 评论(0) | 转发(0) |
0

上一篇:shell中if 比较

下一篇:数组访问越界

给主人留下些什么吧!~~