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

[讨论] 求随机产生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-11-25 03:19 , Processed in 0.025888 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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