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

Obsah / Utility / RANDOM / Proměnná generátoru náhody

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


Proměnná generátoru náhody


; ------------- Seed for random generator

RandSeed:	dd	5623489,8234957	; seed for random generator

Pseudogenerátor náhody potřebuje ke své funkci proměnnou uchovávající jeho aktuální stav, tzv. "krmení". Litos používá 64-bitovou proměnnou RandSeed, která má dostatečně dlouhou dobu pro vyčerpání všech hodnot a zabraňuje možnosti předpovězení příští hodnoty.

Proměnnou RandSeed není potřeba uzamykat proti souběhu procesorů. Jedná se o náhodné číslo a proto neúplné provedení některé operace není na závadu.


; ------------- Initialize random generator

		xor	ax,ax		; AX <- 0
		mov	es,ax		; ES <- 0
		mov	ax,[es:46ch]	; AX <- timer LOW
		add	[RandSeed],ax	; random seed LOW
		add	[RandSeed+4],ax	; random seed LOW 2
		mov	ax,[es:46ch+2]	; AX <- timer HIGH
		add	[RandSeed+2],ax	; random seed HIGH
		add	[RandSeed+6],ax	; random seed HIGH 2

Výchozí hodnota generátoru náhody RandSeed je inicializována během startu systému hodnotou čítače systémových hodin (DWORD na adrese 0040:006ch). Tím je zabráněno opakování stejných posloupností čísel při každém startu systému.


; ------------- Macro - shift random generator with an event

%macro		RNDSHIFT 0
		inc	dword [RandSeed] ; shift random generator
%endmacro

; ------------- Macro - numeric shift random generator with an event
; %1 = data to increase random generator

%macro		RNDSHIFTADD 1
		add	dword [RandSeed],%1 ; shift global random generator
%endmacro

Pro zvýšení náhodnosti je proměnná RandSeed "rozhazována" náhodnými ději v systému, jako je příchod znaku z klávesnice nebo pohyb myší. K tomu slouží makra RNDSHIFT (posun generátoru náhody o 1) a RNDSHIFTADD (posun generátoru náhody o dané číslo, které je parametrem makra). Není na závadu, že je rozhazováno pouze nižší dvojslovo generátoru.


Obsah / Utility / RANDOM / Proměnná generátoru náhody