Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Assembly: Satunnaislukuja

KemXy [12.09.2003 17:32:46]

#

Mitenhän mahtaa saada aikaan satunnaislukuja assemblyllä ilman mitään lisäkirjastoja?

thefox [13.09.2003 22:34:59]

#

Keinoja on monia sanoi Pertti kun persekarvoja nyppi.

MASM32sta löytyi tällainen pätkä:

RAND32		PROTO	:DWORD
InitRand32  PROTO
; random number generator by NaN
; (modified a bit to make it a procedure by Exagone)
.data?
	NaNRand dd ?
.code

SWAP MACRO M1:REQ, M2:REQ
	xor M1, M2
	xor M2, M1
	xor M1, M2
ENDM

InitRand32	proc
  db 0fh,31h
  shr eax, 2
  add eax, 1
  mov NaNRand, eax
ret
InitRand32 endp

RAND32 proc base:DWORD
  ; Random number generator based on the Real time clock
  ; and the Park, Miller random number algorithm
  ;
  ; Coded by NaN for WIN32ASM
  ; May 5, 2001
  ; rev 2.
  push ecx
  push edx


  mov eax, NaNRand
  mov edx,0
  mov ecx, 127773 ;q
  div ecx      ; eax == floor( seed / q)
               ; edx == remainder
  SWAP eax, edx
  push edx
  mov ecx, 16807
  mul ecx      ; eax = mul of remainder * a
  pop edx      ; edx == floor of seed/q

  SWAP eax, edx
  push edx
  mov ecx, 2836
  mul ecx
  pop edx      ; edx == mull of rem * a
               ; eax == mull of seed/q * r

  sub edx, eax
  mov eax, edx
  mov NaNRand, eax ; save next seed
  mov ecx, base
  mov edx, 0
  div ecx
  mov eax, edx
  pop edx
  pop ecx
 ret
RAND32 endp

InitRand32-funktiota voit muokata ellei RDTSC (eli tuo db 0fh,31h) ole käytettävissä (vanha prosessori tms). Kunhan saat "NaNRand"-muuttujaan jonkin seed-arvon niin homma toimii kivasti, DOSissa voit lukea perus-funktioilla aikaa tms. Park, Miller on algona ihan kelpo kamaa.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta