使用时钟中断生成随机数

时间:2013-06-03 13:35:45

标签: assembly interrupt

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

2 个答案:

答案 0 :(得分: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位变体;看到美丽的paper支持这一点。

如果你需要 5 随机数,你可以这样做5次;我很想把它称为 6 次并扔掉其中一个。 5个不同的XOR /移位常数(Marsaglia在他的论文中有几十个),你最好用5个不同的例程,但如果你同步调用它们,它们都会锁定。你可以使用你的中断对其中一个进行恶劣的调用,使它们不同步。

答案 1 :(得分:1)

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

rdtsc % N