网页功能: 加入收藏 设为首页 网站搜索  
随机数发生程序
发表日期:2006-09-03作者:[转贴] 出处:  

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

#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;
}

我来说两句】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 随机数发生程序
本类热点文章
  A*寻路算法(For 初学者)
  A*寻路初探 GameDev.net
  用有限状态机实现的迷宫求解
  计算机中随机数的产生
  精美的随机数生成器程序
  即时战略游戏中如何协调对象移动
  计算几何算法概览
  飞行射击游戏中的碰撞检测
  电脑AI浅谈
  五子棋算法探讨
  小谈网络游戏同步
  五子棋算法
最新分类信息我要发布 
最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放  
Copyright ©2003-2024 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00368