首页
社区
课程
招聘
[求助]请教一个产生随机数的问题
发表于: 2011-12-17 01:39 4613

[求助]请教一个产生随机数的问题

2011-12-17 01:39
4613
以前一直用VC的rand()函数。但是因为一些需要,要求用VC内嵌汇编的方式用汇编实现一个随机数的产生。网上搜,找到一个
RAND PROC
      PUSH CX
      PUSH DX
      PUSH AX
      STI
      MOV AH,0             ;读时钟计数器值
      INT 1AH
      MOV AX,DX            ;清高6位
      AND AH,3
      MOV DL,101           ;除101,产生0~100余数
      DIV DL
      MOV BL,AH            ;余数存BX,作随机数
      POP AX
      POP DX
      POP CX
      RET
RAND ENDP
这是汇编的,我写成VC的
DWORD funcRand()
{
        DWORD dwRet=0;
        __asm
        {
                PUSH CX
                PUSH DX
                PUSH AX
                STI
                MOV AH,0//读时钟计数器值
                INT 0x1A
                MOV AX,DX//清高6位
                AND AH,0x3
                MOV DL,0x101//除101,产生0~100余数
                DIV DL
                MOV BL,0xA//余数除BX,做随机数
                MOV dwRet,EBX
                POP AX
                POP DX
                POP CX
        }
        return dwRet;
}
可是执行到INT 0X1A时就出错了,请问应该怎么改呢?本人新手,望各位高手指点
其实在寻找一个用汇编实现的最快的产生随机数的方法,上面这个方法,我感觉可能比起rand()未必快。
其实我这个帖子的问题准确的说应该是,在VC中,不管是使用汇编的方式还是其他什么方式,有没有取随机数的方式比rand函数快的?

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 84
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
rdtsc取个偶然的随机数
2011-12-17 02:44
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
3
直接找份源代码然后自己理解下吧,就能内嵌汇编了
2011-12-17 05:08
0
雪    币: 209
活跃值: (138)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这个代码不需要到网上去找,微软CRT库里就有:

/***
*rand.c - random number generator
*
*       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
*       defines rand(), srand() - random number generator
*
*******************************************************************************/

#include <cruntime.h>
#include <mtdll.h>
#include <stddef.h>
#include <stdlib.h>

#ifndef _MT
static long holdrand = 1L;
#endif  /* _MT */

/***
*void srand(seed) - seed the random number generator
*
*Purpose:
*       Seeds the random number generator with the int given.  Adapted from the
*       BASIC random number generator.
*
*Entry:
*       unsigned seed - seed to seed rand # generator with
*
*Exit:
*       None.
*
*Exceptions:
*
*******************************************************************************/

void __cdecl srand (
        unsigned int seed
        )
{
#ifdef _MT

        _getptd()->_holdrand = (unsigned long)seed;

#else  /* _MT */
        holdrand = (long)seed;
#endif  /* _MT */
}


/***
*int rand() - returns a random number
*
*Purpose:
*       returns a pseudo-random number 0 through 32767.
*
*Entry:
*       None.
*
*Exit:
*       Returns a pseudo-random number 0 through 32767.
*
*Exceptions:
*
*******************************************************************************/

int __cdecl rand (
        void
        )
{
#ifdef _MT

        _ptiddata ptd = _getptd();

        return( ((ptd->_holdrand = ptd->_holdrand * 214013L
            + 2531011L) >> 16) & 0x7fff );

#else  /* _MT */
        return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
#endif  /* _MT */
}


代码看起来不少,实际上就几句话:

1、一个全局变量做种子;
2、每次调用rand的时候按照一个数学法则来对种子运算,得到随机数的同时设定新的种子值;
3、针对多线程做了特殊处理;

如果我们要做的话完全可以简化成一个函数,转成汇编也不难。
2011-12-17 09:05
0
雪    币: 86
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
TC参考书中有rand()汇编源代码
2011-12-17 12:39
0
雪    币: 94
活跃值: (445)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢各位的指教,我看了下你们推荐的文章,最好还是觉得采用一个全局种子比较好,也更简单。谢谢了
2011-12-17 14:54
0
游客
登录 | 注册 方可回帖
返回
//