找回密码
 欢迎注册
楼主: 无心人

[讨论] 求随机产生0-2^32-1内整数算法

[复制链接]
 楼主| 发表于 2008-3-17 10:12:31 | 显示全部楼层
晕, 那样Call似乎不行
int rand(void)
汇编如何call?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-3-17 10:13:38 | 显示全部楼层
要不手工写个小随机算法插入里面做位随机
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-3-17 11:09:57 | 显示全部楼层
找到个比较复杂的
给汇编化加位随机化


DWORD BitX[5];

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 + 12]
        pmuludq xmm5, xmm1
        mov  edx, 1492
        movd xmm6, edx
        movd xmm2, dword ptr [BitX + 8]
        pmuludq xmm6, xmm2
        paddq xmm5, xmm6
        movd dword ptr [BitX + 12], xmm2
        mov  esi, 1776
        movd xmm7, esi
        movd xmm3, dword ptr [BitX + 4]
        pmuludq xmm7, xmm3
        paddq xmm5, xmm7
        movd dword ptr [BitX + 8], xmm3
        mov  edi, 5115
    movd xmm0, edi
        movd xmm4, dword ptr [BitX]
        pmuludq xmm0, xmm4
        paddq xmm5, xmm0
        movd dword ptr [BitX + 4], xmm4
        movd xmm0, dword ptr [BitX + 16]
    paddq xmm0, xmm5
        movd edx, xmm0
        psrlq xmm0, 32
        movd dword ptr [BitX + 16], xmm0
        mov dword ptr [BitX], edx
        and  edx, 1
        shl edx, cl
        add eax, edx
        sub ecx, 1
        jnc loop1
        }
}
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 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 | 显示全部楼层

  1. DWORD BitX[5];
  2. void BitRandomInit(DWORD seed)
  3. {
  4.   DWORD i;
  5.   DWORD s = seed;
  6.   // make random numbers and put them into the buffer
  7.   for (i = 0; i < 5; i++)
  8.   {
  9.     s = s * 29943829 - 1;
  10.     BitX[ i ] = s;
  11.   }
  12. }


  13. DWORD BitRandom(void)
  14. {
  15.    __asm
  16.   {
  17.   mov ecx, 31
  18.   mov eax, 0
  19. loop1:
  20.   mov ebx, 2111111111
  21.   movd xmm5, ebx
  22.   movd xmm1, dword ptr [BitX + 12] //BitX[3]
  23.   pmuludq xmm5, xmm1
  24.   mov edx, 1492
  25.   movd xmm6, edx
  26.   movd xmm2, dword ptr [BitX + 8] //BitX[2]
  27.   pmuludq xmm6, xmm2
  28.   paddq xmm5, xmm6
  29.   movd dword ptr [BitX + 12], xmm2 //BitX[3]
  30.   mov esi, 1776
  31.   movd xmm7, esi
  32.   movd xmm3, dword ptr [BitX + 4] //BitX[1]
  33.   pmuludq xmm7, xmm3
  34.   paddq xmm5, xmm7
  35.   movd dword ptr [BitX + 8], xmm3 //BitX[2]
  36.   mov edi, 5115
  37.   movd xmm0, edi
  38.   movd xmm4, dword ptr [BitX]    //BitX[0]
  39.   pmuludq xmm0, xmm4
  40.   paddq xmm5, xmm0
  41.   movd dword ptr [BitX + 4], xmm4 //BitX[1]
  42.   movd xmm0, dword ptr [BitX + 16] //BitX[4]
  43.   paddq xmm0, xmm5
  44.   movd edx, xmm0
  45.   psrlq xmm0, 32
  46.   movd dword ptr [BitX + 16], xmm0 //BitX[4]
  47.   mov dword ptr [BitX], edx        //BitX[0]
  48.   and edx, 1
  49.   shl edx, cl
  50.   add eax, edx
  51.   sub ecx, 1
  52.   jnc loop1
  53.   }
  54. }
复制代码
这个代码很有价值,重整理下

点评

你还存在着在这个论坛上?????????  发表于 2013-9-10 15:52
可编辑旧帖,在附加选项里将“□HTML代码”勾选项去掉即可。这是升级后造成的兼容性问题,抱歉。  发表于 2013-9-10 15:47
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-27 03:33 , Processed in 0.042223 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表