会员: 密码:  免费注册 | 忘记密码 | 会员登录 网页功能: 加入收藏 设为首页 网站搜索  
游戏开发 > 程序设计 > 智能算法
随机数发生程序
发表日期:2006-09-03 20:07:31作者: 出处:  

如果还不够快,或者还需要其他属性的随机数,就采用查表方法.
还记得我以前提的方案吗?

#include <memory.h>
#define DWORD unsigned long

DWORD MCoef_32[2]={0xE7BD2160,0xDA3A2A9C};
// 两个小m序列系数


DWORD m_Seq_32_m(DWORD dwMset,DWORD dwKey,int nNumber, DWORD * pdwRandom)
// dwMset: 随机发生器所使用的小m序列

// dwKey: 随机数种子

// nNumber: 产生的随机序列长度(以DWORD为单位)

// pdwRandom: 指向随机数存储空间的指针

// return value: 运算完成之后随机数发生器的状态

{
    _asm
    {
        CLD
        MOV EDI,pdwRandom;
        MOV ECX,nNumber;
        MOV ESI,dwMset;
        MOV EAX,dwKey;
        ALIGN 4
LOOP_CIRCLE1:
        PUSH ECX
        MOV ECX,32
LOOP_CIRCLE2:
        MOV EBX,EAX;
        SHL EAX,1
        AND EBX,ESI; //select the bit for xor

        MOV EDX,EBX;
        BSWAP EBX;
        XOR BX,DX;
        XOR BH,BL; // because P only judge one byte

        // so must XOR to judge the p of whole word

        JP NEXT //jp equals the xor

        INC EAX
NEXT:
        DEC ecx
        JNZ LOOP_CIRCLE2
        POP ECX
        STOSD
        DEC ECX
        JNZ LOOP_CIRCLE1
        MOV dwKey,EAX
    }
    return dwKey;
}

void RandomGenerator(void * Buffer, int nlength)
// 产生长度为nLength字节的随机数

// Buffer: 指向随机数存放区域的指针

// nLength: 产生随机数数量

{
    DWORD A;
    BYTE B[4];
    _asm
    {
        _emit 0x0f
        _emit 0x31
        MOV A,EAX
    }
    A=m_Seq_32_m(MCoef_32[0],A,nLength/4,(DWORD *)Buffer);
    if(nLength%4!=0)
    {
        m_Seq_32_m(MCoef_32[0],A,1,(DWORD *)B);
        memcpy(Buffer+(nLength/4)*4,B,nLength%4);
    }
    return;
}

返回顶部】 【打印本页】 【关闭窗口

关于我们 / 给我留言 / 版权举报 / 意见建议 / 网站编程QQ群   
Copyright ©2003- 2024 Lihuasoft.net webmaster(at)lihuasoft.net 加载时间 0.00274