Librería C - Random
Este es el código fuente en C correspondiente al comando random
de DariOS. Esta librería proporciona funciones para inicializar una semilla y generar números pseudoaleatorios de 16 bits.
Propósito
Proporcionar una implementación sencilla de generación de números aleatorios utilizando un algoritmo lineal congruencial.
Código explicado paso a paso
unsigned long seed = 0x12345678;
- Variable global que mantiene la semilla actual del generador. Se inicializa con un valor predeterminado (
0x12345678
).
void srand(unsigned long new_seed) {
seed = new_seed;
}
- Función que permite establecer manualmente la semilla del generador.
- Reemplaza el valor de
seed
por el nuevo valor proporcionado (new_seed
).
unsigned short rand(void) {
seed = seed * 1103515245 + 12345;
return (unsigned short)(seed >> 16);
}
- Genera un nuevo número aleatorio actualizando la semilla usando la fórmula del generador congruencial lineal (LCG).
- La constante
1103515245
y el incremento12345
son parámetros típicos del LCG usado por la biblioteca estándar de C. - El valor retornado es un
unsigned short
(16 bits), que se obtiene tomando los 16 bits más altos del nuevo valor deseed
(usandoseed >> 16
). - Esta función no es criptográficamente segura.
Código compilado a a nasm
section .data
seed dd 0x12345678 ; Variable global seed de 32 bits
buffer_numero resb 6
section .text
global _srand
global _rand
_srand:
push bp
mov bp, sp
mov ax, [bp + 4] ; low word de new_seed
mov bx, [bp + 6] ; high word de new_seed
mov [seed], ax
mov [seed + 2], bx
pop bp
ret
_rand:
push bp
mov bp, sp
push di
push si
; seed = seed * 1103515245 + 12345
; 1103515245 = 0x41C64E6D = $41C6:$4E6D
; Carga seed
mov ax, [seed]
mov dx, [seed + 2]
; Multiplicación simple (no completa): ax = ax * 0x4E6D + dx * 0x41C6 << 16
; Aquí usamos solo parte baja por simplicidad
mov bx, 0x4E6D
mul bx ; AX = AX * BX (parte baja)
add ax, 0x3039 ; +12345
adc dx, 0 ; Ajuste de acarreo
mov [seed], ax
mov [seed + 2], dx
; return (unsigned short)(seed >> 16)
mov ax, dx ; Parte alta del seed
pop si
pop di
pop bp
ret