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

Obsah / Utility / RANDOM / Výpočet náhodného čísla

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


Výpočet náhodného čísla


; new_seed = old_seed*RNDCOEFF1 + RNDCOEFF2

RNDCOEFF1	EQU	214013		; random coefficient 1 (multiple)
RNDCOEFF2	EQU	2531011		; random coefficient 2 (add)

Algoritmus výpočtu náhodného čísla je převzat z interpreteru BASIC firmy Microsoft a je popsán v Knowledgebase Q28150. Základem výpočtu je vzorec "seed = seed * coeff1 + coeff2". Nejčastěji používanými hodnotami koeficientů coeff1 / coeff2 jsou 214013 / 2531011, tyto hodnoty jsou i používány v Litosu. Další možné hodnoty koeficientů jsou 17405 / 10395331, 214013 / 13737667 a 214013 / 10395331.


; ------------- Macro - next random value (EAX:EDX=output)

%macro		RANDNEXT 0
		mov	eax,RNDCOEFF1		; EAX <- coefficient 1
		mul	dword [RandSeed]	; EAX <- multiple seed LOW
		add	eax,RNDCOEFF2		; add coefficient 2
		adc	edx,dword [RandSeed+4]	; add seed HIGH
		mov	dword [RandSeed],edx	; store new seed LOW
		mov	dword [RandSeed+4],eax	; store new seed HIGH
%endmacro 

K výpočtu nové hodnoty generátoru náhody je použit "částečně 64-bitový" výpočet, který je poměrně rychlý a přitom zajišťuje značně vyšší rozsah náhodnosti než klasický výpočet s 32-bitovým číslem.

Při výpočtu pomocí makra RANDNEXT je do registru EAX připraven první koeficient RNDCOEFF1 (pro násobení). Tímto koeficientem je vynásobeno nižší dvojslovo generátoru náhody, výsledek násobení se uloží do registrů EDX:EAX. K nižšímu dvojslovu výsledku je přičten druhý koeficient, RNDCOEFF2 a přenos součtu je přičten k vyššímu dvojslovu výsledku spolu s vyšším dvojslovem generátoru náhody. Dvojslova výsledku jsou uložena zaměněná, tj. vyšší dvojslovo je uloženo do nižšího dvojslova generátoru náhody a nižší dvojslovo do vyššího.


Obsah / Utility / RANDOM / Výpočet náhodného čísla