1

我需要生成 5 个随机数,为此我使用了时钟中断:mov ah,2ch int 21h。我花了毫秒(DL),这应该是随机数。但我得到相同的数字 5 次。如果您有另一种使用中断解决问题的方法,请提供帮助。

4

2 回答 2

2

如果您的处理器有 rdrand (请参阅对另一个答案的评论),它似乎是个好主意。我认为它是最近添加的英特尔 CPU,所以我认为它们不会,而且我也不认为它很快。

如果没有,并且您想要在汇编代码中快速、高质量(伪)随机数,XORShift 随机数生成器似乎相当不错。短代码,长周期,优秀的统计数据。这是我在(32 位)工作窃取 SMP 处理器调度程序中使用的,用于决定从哪个处理器窃取:

DATA_ALIGN_TO_CACHE_LINE
   public XORRNGvalue32
XORRNGvalue32 dword  2463534242           ; see COMPUTE_RANDOM32 macro
; XORShift random number generator; see http://en.wikipedia.org/wiki/Xorshift
; or Marsaglia, George (July 2003). "Xorshift RNGs". Journal of Statistical Software Vol. 8 (Issue  14).

 COMPUTE_RANDOM32 macro ; uses EAX and EDX
; Marsaglia suggested 32 bit RNG:
;  unsigned long xor()
;    { static unsigned long y=2463534242; "32 bit seed value y"
;      y =(y<<13); y^=(y>>17); return (y =(y<<5)); }
      mov     eax,  XORRNGvalue32
      mov     edx, eax
      shl     eax, 13
      xor     eax, edx
      mov     edx, eax
      shr     eax, 17
      xor     eax, edx
      mov     edx, eax
      shl     eax, 5
      xor     eax, edx
      mov     XORRNGvalue32, eax ; has nice random number in EAX here
  endm

如果你想将种子初始化为一个时钟值(例如,RDTSC),你可以这样做。

实现 64 位变体非常容易;看到漂亮的论文支持这一点。

如果您需要5 个随机数,则可以调用 5 次即可;我很想给它打电话6次,然后把其中一个扔掉。最好使用 5 个不同的例程和 5 个不同的 XOR/移位常量(Marsaglia 在他的论文中有几十个),但是如果你同步调用它们,它们都会同步运行。您可以使用您的中断对其中一个进行过分的调用,以使它们失相。

于 2013-06-04T06:37:08.043 回答
1

如果您需要一个小的(伪)随机数,请使用:

rdtsc % N
于 2013-06-03T15:11:44.183 回答