我需要生成5个随机数,为此我使用了时钟的中断:mov ah,2ch int 21h。我花了几毫秒(DL),这应该是随机数。但我得到相同的数字5次。如果您有其他方法可以使用中断解决问题,请提供帮助。
答案 0 :(得分:2)
如果没有,并且你想要汇编代码中的快速,高品质(伪)随机数,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