随机数

来源:互联网 发布:java企业网站源码下载 编辑:程序博客网 时间:2024/04/26 03:11

在WIn32 c/c++编程中使用rand()函数(用srand()设置种子)就可以获得一个随机数

   然后将得到的随机数处理就可以得到某一范围内的随机数

 

用汇编来实现也很简单

  随机数关键要获得一个每一次都不同的数

     RDTSC这个指令可以获得计算机启动以来CPU运行的周期数,

     其结果保存在EDX:EAX中,EDX是高位,EAX是低位

 

以下为getRandom()函数的源码

====getrandom.asm====

segment .text
    global getRandom
getRandom:
    push ebp
    mov  ebp,esp
    rdtsc
    shr  eax,2
    mov  ebx,[ebp+12]
    add  ebx,1
    sub  ebx,[ebp+8]
    cdq
    idiv ebx
    add  edx,[ebp+8]
    mov  eax,edx
    mov  esp,ebp
    pop  ebp
    ret

 

=======main.c========

#include<stdio.h>
int getRandom(int a,int b);
int main()
{
 int i;
 int t;
 float s[16]={0};
 float p;
 for(i=0;i<500000;i++)
 {
  t=getRandom(20,35);
  //printf("%d ",t);
  s[t-20]++;
 }
 printf("/nresult:/n");
 for(i=0;i<16;i++)
 {
  p=s[i]/500000;
  printf("%d has %d ,Percent is %f/n",i+20,(int)s[i],p);
 }
 return 0;
}

 

========build.bat=====

nasm -f win32 getrandom.asm --prefix _
cl -c main.c
link main.obj getrandom.obj
if exist getrandom.obj del getrandom.obj
if exist main.obj del main.obj

=====================