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