无心人 发表于 2008-3-17 10:12:31

晕, 那样Call似乎不行
int rand(void)
汇编如何call?

无心人 发表于 2008-3-17 10:13:38

要不手工写个小随机算法插入里面做位随机 :)

无心人 发表于 2008-3-17 11:09:57

找到个比较复杂的
给汇编化加位随机化
:lol

DWORD BitX;

void BitRandomInit(DWORD seed)
{
DWORD i;
DWORD s = seed;
// make random numbers and put them into the buffer
for (i = 0; i < 5; i++) {
    s = s * 29943829 - 1;
    BitX[ i ] = s;
}
}

DWORD BitRandom(void)
{
      __asm
      {
      mov ecx, 31
      mov eax, 0
loop1:
      movebx, 2111111111
    movd xmm5, ebx      
      movd xmm1, dword ptr
      pmuludq xmm5, xmm1
      movedx, 1492
      movd xmm6, edx
      movd xmm2, dword ptr
      pmuludq xmm6, xmm2
      paddq xmm5, xmm6
      movd dword ptr , xmm2
      movesi, 1776
      movd xmm7, esi
      movd xmm3, dword ptr
      pmuludq xmm7, xmm3
      paddq xmm5, xmm7
      movd dword ptr , xmm3
      movedi, 5115
    movd xmm0, edi
      movd xmm4, dword ptr
      pmuludq xmm0, xmm4
      paddq xmm5, xmm0
      movd dword ptr , xmm4
      movd xmm0, dword ptr
    paddq xmm0, xmm5
      movd edx, xmm0
      psrlq xmm0, 32
      movd dword ptr , xmm0
      mov dword ptr , edx
      andedx, 1
      shl edx, cl
      add eax, edx
      sub ecx, 1
      jnc loop1
      }
}

mathe 发表于 2008-3-17 11:19:55

这样应该会好一些。不过这个要看计算随机数部分数据占用整个计算的比例是多少。通常,如果前面部分计算占用比列过大,很难衡量后面部分代码的时间,因为我们测量到的大部分时间是前面计算的时间。
还有,同样一段代码,最好多运行几次,看看运行时间的稳定性如何,如果多次运行发现时间变化相对比较大(比如已经超出两种不同算法得到的时间差),那么测量的意义也不是很大。

无心人 发表于 2008-3-17 11:35:27

终于通过调试了
10万的时间是109ms

无心人 发表于 2008-3-18 14:19:15

封存
处理完128位乘法如果有兴趣可能写个BBS位算法

无心人 发表于 2013-9-10 15:37:00


DWORD BitX;
void BitRandomInit(DWORD seed)
{
DWORD i;
DWORD s = seed;
// make random numbers and put them into the buffer
for (i = 0; i < 5; i++)
{
    s = s * 29943829 - 1;
    BitX[ i ] = s;
}
}


DWORD BitRandom(void)
{
   __asm
{
mov ecx, 31
mov eax, 0
loop1:
mov ebx, 2111111111
movd xmm5, ebx
movd xmm1, dword ptr //BitX
pmuludq xmm5, xmm1
mov edx, 1492
movd xmm6, edx
movd xmm2, dword ptr //BitX
pmuludq xmm6, xmm2
paddq xmm5, xmm6
movd dword ptr , xmm2 //BitX
mov esi, 1776
movd xmm7, esi
movd xmm3, dword ptr //BitX
pmuludq xmm7, xmm3
paddq xmm5, xmm7
movd dword ptr , xmm3 //BitX
mov edi, 5115
movd xmm0, edi
movd xmm4, dword ptr     //BitX
pmuludq xmm0, xmm4
paddq xmm5, xmm0
movd dword ptr , xmm4 //BitX
movd xmm0, dword ptr //BitX
paddq xmm0, xmm5
movd edx, xmm0
psrlq xmm0, 32
movd dword ptr , xmm0 //BitX
mov dword ptr , edx      //BitX
and edx, 1
shl edx, cl
add eax, edx
sub ecx, 1
jnc loop1
}
}这个代码很有价值,重整理下
页: 1 [2]
查看完整版本: 求随机产生0-2^32-1内整数算法