资源简介

改进的快速Mersenne twister随机数算法 非常适合做FPGA算法使用 随机性好,占用资源非常少,标准算法的1/1000, 非常适合用来做快速加密用,在我的几个项目中使效果非常好。

资源截图

代码片段和文件信息

#include “stdafx.h“

#define  MT_LEN   4
#define  MT_VL    2
#define  MSK_UP   0xFFFE0000
#define  MSK_DN   0x0001FFFF

#define  MERS_A   0xF4973C15
#define  MERS_B   0x452796A4
#define  MERS_C   0x165F7B46

static unsigned int mt[MT_LEN];
static unsigned int mti = 0;

static void init0(unsigned int seed)
{
    unsigned int y;
    unsigned int i;
    mt[0] = seed;

    for( mti = 1; mti < MT_LEN; mti++ ) {
        mt[mti] = (((mt[mti-1] ^ (mt[mti-1]>>3))<<10)|0x025D) + mti;    
    }
    
    for( i = 0; i < MT_LEN - MT_VL; i++ ) {
        y = (mt[i] & MSK_UP) | (mt[i+1] & MSK_DN);
        mt[i] = mt[i+MT_VL] ^ (y>>1) ^ (((y & 0x01) == 1) ? MERS_A : 0);
    }
    for( ; i < MT_LEN - 1; i++ ) {
        y = (mt[i] & MSK_UP) | (mt[i+1] & MSK_DN);
        mt[i] = mt[i+(MT_VL - MT_LEN)] ^ (y>>1) ^ (((y & 0x01) == 1) ? MERS_A : 0);
    }
    y = (mt[i] & MSK_UP) | (mt[0] & MSK_DN);
    mt[i] = mt[MT_VL - 1] ^ (y>>1) ^ (((y & 0x01) == 1) ? MERS_A : 0);

    mti = 0;

    return;
}

static unsigned int BRandom(void)
{
    unsigned int ret = 0;
    
    ret = mt[mti];
    ret ^= ret>>13;
    ret ^= (ret<<7) & MERS_B;
    ret ^= (ret<<15) & MERS_C;
    ret ^= ret>>8;
    mt[mti++] = ret + 1;
    if( mti == MT_LEN ) {
        mti = 0;
    }
    return ret;
}

int _tmain(int argc _TCHAR* argv[])
{
    unsigned int i;
    unsigned int firstr;
    unsigned int t;

    init0(0x33914F8D);

    firstr = BRandom();
    printf(“%08X\r\n“ firstr);
    i = 1;
    while(1) {
        t = BRandom();
        if( t == firstr ) {
            break;
        }
        i++;
        printf(“%08X\r\n“ t);
    }
    printf(“[%lu]\r\n“ i);
   
return 0;
}


 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        1736  2017-06-03 09:35  MTSRandom.cpp

评论

共有 条评论