Generación de Variables Aleatorias · Tema 21

Generación uniforme continua

La base U(a,b) de toda la simulación continua: escala y desplaza U(0,1) con media (a+b)/2.

01 · Punto de partida

El ladrillo continuo del simulador

¿Un retardo entre 2 y 5 segundos? ¿Una posición al azar en [0,10)? ¿Ruido ±0,5 sobre una señal? Todos son U(a,b): probabilidad repartida pareja en un intervalo continuo.

Es la salida cruda del generador base y la entrada de casi todos los métodos continuos: invertirla da exponenciales y otras leyes (Temas 22–27), y sin ella no hay Monte Carlo ni jitter.

  • ¿Por qué a + (b−a)·U ya es exacto?
  • ¿Qué densidad, CDF, media y varianza debe reproducir?
  • ¿El borde b se incluye o no? ¿Importa?
  • ¿Cuándo el flotante rompe la uniformidad?

02 · Definición

Densidad plana y rampa lineal

f(x) = 1/(b−a) en [a,b), F(x) = 0 si x < a, (x−a)/(b−a) si a ≤ x < b, 1 si x ≥ b. E[X] = (a+b)/2, Var(X) = (b−a)²/12.

⇔

Escala y desplaza

(b−a) estira [0,1) al ancho pedido; +a lo ubica. Transformación lineal exacta, sin rechazo ni tablas.

▭

Planicie total

Cualquier subintervalo de igual largo tiene igual probabilidad. El histograma con N grande es plano a la altura 1/(b−a).

⚙

O(1) base

Una multiplicación + una suma por muestra. Alimenta inversa, Box-Muller, jitter y Monte Carlo.

Mismo método, distintos intervalos: solo cambian escala y centro.
CasoMediaVarianzaDensidad
U(0,1)0,500,08331,0
U(2,8)5,003,000,1667
U(−1,1)0,000,33330,50

03 · Anatomía

Bordes, flotante y resolución

Fórmula canónica
a + (b - a) * U con U ∈ [0,1). Da [a,b): el a sale, el b exacto casi nunca. En continuo, incluir o no un punto mide 0.
Orden de operaciones
Con |a| ≫ (b−a) se pierde resolución (cancelación). Preferir a * (1 - U) + b * U si el intervalo está lejos del cero.
Resolución finita
El doble tiene 2⁵³ valores en [0,1): intervalos de ~10⁻¹⁶. Con (b−a) > 2⁵³ o con bin ultra fino, usar enteros nativos o uniform de la librería.
No discretizar sin querer
int(), round() o pocos decimales convierten U(a,b) en discreta. Mantener flotante hasta el modelo que lo pida (Temas 17, 34).

Escala lineal

Exacta y auditable

Media y varianza calzan con (a+b)/2 y (b−a)²/12. Dos momentos verifican el generador.

Módulo o recorte

Deforma bordes

U % ancho + a o clampear colas apila masa en los extremos. El histograma lo delata con N grande.

04 · Para qué sirve una planicie

De la base al modelo

U(0,1)→U(a,b)→inversa · jitter
  1. 1
    Tiempos y posiciones.

    Retardos, llegadas uniformes en una ventana, puntos al azar en un segmento.

  2. 2
    Entrada de la inversa.

    X = F⁻¹(U) con U ~ U(0,1) genera exponenciales, Weibull y más. (Temas 5, 22, 27)

  3. 3
    Jitter y Monte Carlo.

    Ruido ±h para romper empates, e integración promediando f sobre U(a,b).

  4. 4
    Regla de escala.

    Si necesitás otro ancho o centro, reescalá: no busques otro generador.

05 · Representación en Python

Escala canónica y auditoría de momentos

Implementación directa más chequeo de media/varianza contra (a+b)/2 y (b−a)²/12.

Python en tu navegador. Probá a = −3, b = 3: la varianza teórica es 3,0.

import random

random.seed(170)
a, b = 2.0, 8.0
N = 12000

def uniforme_continua(a, b):
    return a + (b - a) * random.random()

m = [uniforme_continua(a, b) for _ in range(N)]
media = sum(m) / N
var = sum((x - media) ** 2 for x in m) / N
print("media:", round(media, 3), "teórica:", (a + b) / 2)
print("var:", round(var, 3), "teórica:", round((b - a) ** 2 / 12, 3))
print("min:", round(min(m), 3), "max:", round(max(m), 3))

Media ≈ 5,0 y var ≈ 3,0. El mínimo roza 2 y el máximo roza 8 sin pasarse.

06 · Exploración

Laboratorio: planicie que se muda y se estira

Movete a, el ancho y N. El histograma usa 20 bines entre a y b: cada barra debe pegarse a la línea 1/20 = 0,05. Con N chico hay ruido; con N grande, planicie.

EXPERIMENTO 21

Planicie U(a,b)

X = a + (b − a)·U

Los resultados numéricos aparecen debajo.
Media muestral5,000
Teórica (a+b)/25,000
Var. muestral3,000
Error máx. bin0,000

Con a 2, b 8 y N 6000, planicie en 0,05 por bin.

20 bines entre a y b vs línea teórica. Probá ancho 10 con N = 200 (ruido) y N = 12000 (plano).

Preguntas para explorar

  1. Con a = 2 y ancho 6, ¿media y varianza teóricas?
  2. Mové a de 0 a 5 con ancho fijo. ¿Cambia la forma o solo la ubicación?
  3. Duplicá el ancho. ¿La altura por bin cambia? ¿Y la varianza?
Ver respuestas sugeridas
  1. b = 8, media 5,0 y varianza 36/12 = 3,0.
  2. Solo la ubicación: la planicie se traslada, la forma y la altura por bin (0,05) no cambian.
  3. La altura por bin sigue en 0,05 (son 20 bines relativos); la varianza se cuadruplica con el ancho.

07 · Comprensión

Confusiones frecuentes

«U(0,1) y U(a,b) son otro generador»

No: es el mismo generador reescalado. Pedir otra función base para cada intervalo es deuda técnica.

«El borde b incluido no importa nunca»

En continuo un punto mide 0, pero en código b exacto puede romper un índice o una inversa con log(0). Fijar el convenio [a,b).

«Con N = 100 ya se ve plana»

Con 20 bines y N = 100 hay ~5 puntos por bin: ruido ±0,02. La planicie exige miles de réplicas.

«Redondeo a 2 decimales y sigue uniforme»

Redondear crea una discreta de centésimas con bordes a mitad de peso. Mantener flotante completo.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: retardo auditado

Retardo U(2,8), N = 12000, semilla 171: verificá media 5,0 y var 3,0.

import random

random.seed(171)
a, b, N = 2.0, 8.0, 12000
m = [a + (b - a) * random.random() for _ in range(N)]
media = sum(m) / N
print(round(media, 3), round(sum((x-media)**2 for x in m)/N, 3))
Ver solución razonada

≈ 5,0 y ≈ 3,0 (típicamente 4,95–5,05 y 2,9–3,1). Desvíos mayores con N = 12000 ya huelen a bug.

Ejercicio 2: cazar el módulo

Compará a + (b−a)·U vs (a + 7·U) % 6 + 2 con a = 2, b = 8 y 20000 tiros. ¿Qué bordes se deforman?

import random

random.seed(172)
a, b, N = 2.0, 8.0, 20000
bien = [a + (b - a) * random.random() for _ in range(N)]
random.seed(172)
mal = [(a + 7 * random.random()) % 6 + 2 for _ in range(N)]
print("bien min/max:", round(min(bien), 2), round(max(bien), 2))
print("mal min/max: ", round(min(mal), 2), round(max(mal), 2))
Ver solución

Bien cubre [2,8) parejo; mal pliega la cola que supera 8 sobre [2,3): ese bin queda con doble masa. El histograma lo delata.

Ejercicio 3: jitter simétrico

Con U(−1,1) sumá jitter a 2000 señales y verificá que la media del ruido ≈ 0 y la varianza ≈ 1/3.

Ver una posible respuesta
import random

random.seed(173)
a, b, N = -1.0, 1.0, 2000
m = [a + (b - a) * random.random() for _ in range(N)]
media = sum(m) / N
print(round(media, 3), "vs 0.0")
print(round(sum((x-media)**2 for x in m)/N, 3), "vs 0.333")

Media ≈ 0 (±0,03) y var ≈ 0,33. El jitter simétrico no sesga la señal, solo la dispersa.

09 · Síntesis

Ideas para recordar

  • U(a,b) = a + (b−a)·U(0,1): escala y desplaza, sin rechazo.
  • Densidad 1/(b−a), media (a+b)/2, varianza (b−a)²/12.
  • Convenio [a,b): el b exacto se rechaza o se evita.
  • Histograma plano con N grande; N chico es ruido, no sesgo.
  • Base de inversa, jitter y Monte Carlo.

En el próximo tema mediremos esperas: la exponencial con −ln(U)/λ.