Tvůrce webu je i pro tebe! Postav třeba web. Bez grafika. Bez kodéra. Hned.
wz

Obsah / Utility / RANDOM / Náhodné číslo v intervalu

Zdrojový kód: INCLUDE\UTIL\RANDOM.INC, UTIL\RANDOM.ASM


Náhodné číslo v intervalu


; -----------------------------------------------------------------------------
;                       Get random byte in interval
; -----------------------------------------------------------------------------
; INPUT:	AL = maximal value (signed or unsigned)
;		AH = minimal value (signed or unsigned)
; OUTPUT:	AL = random byte (min to max)
; -----------------------------------------------------------------------------

RandIntChar:
RandIntByte:	sub	al,ah		; AL <- new maximal value
		call	RandMaxByte	; generate random byte
		add	al,ah		; AL <- add minimal value
		ret

Funkce RandIntByte (RandIntChar) vygeneruje náhodné číslo "bajt bez znaménka" nebo "bajt se znaménkem" v intervalu od daného minima až po zadané maximum. Minimální hodnota intervalu je na vstupu funkce dána obsahem registru AH, maximální hodnota je dána obsahem registru AL. Číslo je generováno s využitím funkce RandMaxByte, která vygeneruje náhodné číslo v rozsahu daném rozdílem maximální a minimální hodnoty čísla. Leží-li minimální hodnota nad maximální hodnotou, vygeneruje se číslo ležící vně intervalu, není proto třeba rozlišovat interval se znaménkem a interval bez znaménka.


; -----------------------------------------------------------------------------
;                     Get random word in interval
; -----------------------------------------------------------------------------
; INPUT:	AX = maximal value (signed or unsigned)
;		DX = minimal value (signed or unsigned)
; OUTPUT:	AX = random word (min to max)
; -----------------------------------------------------------------------------

RandIntShort:
RandIntWord:	sub	ax,dx		; AX <- new maximal value
		call	RandMaxWord	; generate random word
		add	ax,dx		; AX <- add minimal value
		ret

Funkce RandIntWord (RandIntShort) vygeneruje náhodné číslo "slovo bez znaménka" nebo "slovo se znaménkem" v intervalu od daného minima až po zadané maximum. Minimální hodnota intervalu je na vstupu funkce dána obsahem registru DX, maximální hodnota je dána obsahem registru AX. Číslo je generováno s využitím funkce RandMaxWord, která vygeneruje náhodné číslo v rozsahu daném rozdílem maximální a minimální hodnoty čísla. Leží-li minimální hodnota nad maximální hodnotou, vygeneruje se číslo ležící vně intervalu, není proto třeba rozlišovat interval se znaménkem a interval bez znaménka.


; -----------------------------------------------------------------------------
;                   Get random double word in interval
; -----------------------------------------------------------------------------
; INPUT:	EAX = maximal value (signed or unsigned)
;		EDX = minimal value (signed or unsigned)
; OUTPUT:	EAX = random double word (min to max)
; -----------------------------------------------------------------------------

RandIntLong:
RandIntDWord:	sub	eax,edx		; EAX <- new maximal value
		call	RandMaxDWord	; generate random double word
		add	eax,edx		; EAX <- add minimal value
		ret

Funkce RandIntDWord (RandIntLong) vygeneruje náhodné číslo "dvojslovo bez znaménka" nebo "dvojslovo se znaménkem" v intervalu od daného minima až po zadané maximum. Minimální hodnota intervalu je na vstupu funkce dána obsahem registru EDX, maximální hodnota je dána obsahem registru EAX. Číslo je generováno s využitím funkce RandMaxDWord, která vygeneruje náhodné číslo v rozsahu daném rozdílem maximální a minimální hodnoty čísla. Leží-li minimální hodnota nad maximální hodnotou, vygeneruje se číslo ležící vně intervalu, není proto třeba rozlišovat interval se znaménkem a interval bez znaménka.


; -----------------------------------------------------------------------------
;                  Get random quadruple word in interval
; -----------------------------------------------------------------------------
; INPUT:	EDX:EAX = maximal value (signed or unsigned)
;		EBX:ECX = minimal value (signed or unsigned)
; OUTPUT:	EDX:EAX = random quadruple word (min to max)
; -----------------------------------------------------------------------------

RandIntInt64:
RandIntQWord:	sub	eax,ecx		; EAX <- new maximal value LOW
		sbb	edx,ebx		; EDX <- new maximal value HIGH
		call	RandMaxQWord	; generate random quadruple word
		add	eax,ecx		; EAX <- add minimal value LOW
		adc	edx,ebx		; EDX <- add minimal value HIGH
		ret

Funkce RandIntQWord (RandIntInt64) vygeneruje náhodné číslo "čtyřslovo bez znaménka" nebo "čtyřslovo se znaménkem" v intervalu od daného minima až po zadané maximum. Minimální hodnota intervalu je na vstupu funkce dána obsahem registrů EBX:ECX, maximální hodnota je dána obsahem registrů EDX:EAX. Číslo je generováno s využitím funkce RandMaxQWord, která vygeneruje náhodné číslo v rozsahu daném rozdílem maximální a minimální hodnoty čísla. Leží-li minimální hodnota nad maximální hodnotou, vygeneruje se číslo ležící vně intervalu, není proto třeba rozlišovat interval se znaménkem a interval bez znaménka.


; -----------------------------------------------------------------------------
;                  Get random float in interval (10 digits)
; -----------------------------------------------------------------------------
; INPUT:	ST0 = maximal value (can be signed)
;		ST1 = minimal value (can be signed)
; OUTPUT:	ST0 = random float (min to max)
; NOTES:	Warning - this function uses FPU (push/pop state if in kernel).
; -----------------------------------------------------------------------------

RandIntFloat:	fsub	st0,st1		; subtract minimal value
		call	RandMaxFloat	; generate random float
		faddp	st1,st0		; random value
		ret	

Funkce RandIntFloat vygeneruje náhodné desetinné číslo s jednoduchou přesností v intervalu od daného minima až po zadané maximum. Minimální hodnota intervalu je na vstupu funkce dána obsahem registru koprocesoru ST1, maximální hodnota je dána obsahem registru koprocesoru ST0. Číslo je generováno s využitím funkce RandMaxFloat, která vygeneruje náhodné číslo v rozsahu daném rozdílem maximální a minimální hodnoty čísla. Nezáleží na pořadí hodnot minima a maxima, maximum může být menší než minimum.

Při generování čísla se od maxima v registru ST0 odečte minimum z registru ST1, v registru ST0 bude tedy interval pro generování čísla (může to být jak kladná tak i záporná hodnota nebo nula). Po vygenerování náhodného čísla funkcí RandMaxFloat (vygenerované číslo přitom nahradí původní hodnotu registru ST0, tj. velikost intervalu) se výsledek v registru ST0 přičte k původní minimální hodnotě v registru ST1, registr ST0 se zruší a výsledná hodnota bude novým obsahem registru ST0.

Protože funkce používá matematický koprocesor, je nutné pamatovat na uchování stavu koprocesoru v případě, že funkce je interně používána jádrem systému.


; -----------------------------------------------------------------------------
;               Get random double float in interval (16 digits)
; -----------------------------------------------------------------------------
; INPUT:	ST0 = maximal value (can be signed)
;		ST1 = minimal value (can be signed)
; OUTPUT:	ST0 = random double float (min to max)
; NOTES:	Warning - this function uses FPU (push/pop state if in kernel).
; -----------------------------------------------------------------------------

RandIntDouble:	fsub	st0,st1		; subtract minimal value
		call	RandMaxDouble	; generate random double float
		faddp	st1,st0		; random value
		ret	

Funkce RandIntDouble vygeneruje náhodné desetinné číslo s dvojitou přesností v intervalu od daného minima až po zadané maximum. Minimální hodnota intervalu je na vstupu funkce dána obsahem registru koprocesoru ST1, maximální hodnota je dána obsahem registru koprocesoru ST0. Číslo je generováno s využitím funkce RandMaxDouble, která vygeneruje náhodné číslo v rozsahu daném rozdílem maximální a minimální hodnoty čísla. Nezáleží na pořadí hodnot minima a maxima, maximum může být menší než minimum.

Při generování čísla se od maxima v registru ST0 odečte minimum z registru ST1, v registru ST0 bude tedy interval pro generování čísla (může to být jak kladná tak i záporná hodnota nebo nula). Po vygenerování náhodného čísla funkcí RandMaxDouble (vygenerované číslo přitom nahradí původní hodnotu registru ST0, tj. velikost intervalu) se výsledek v registru ST0 přičte k původní minimální hodnotě v registru ST1, registr ST0 se zruší a výsledná hodnota bude novým obsahem registru ST0.

Protože funkce používá matematický koprocesor, je nutné pamatovat na uchování stavu koprocesoru v případě, že funkce je interně používána jádrem systému.


Obsah / Utility / RANDOM / Náhodné číslo v intervalu