Skip to main content

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.

randomC


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 incremento 12345 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 de seed (usando seed >> 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