Cómo equilibrar las probabilidades para que no aburra

Claim Your Loot

·

Portada del artículo «Equilibrar las probabilidades», de la sección Sistemas de botín

Pones un 1 % al objeto legendario. Matemáticamente perfecto. Y entonces un jugador lo saca en la tirada tres y otro lleva cuatrocientas sin ver nada. Los dos números son normales; el segundo jugador se ha ido del juego.

El azar puro es justo pero cruel, y no distingue entre «poco probable» y «desesperante». Este artículo va de las tres herramientas que arreglan eso sin mentir a nadie: el contador de mala suerte, los topes y las probabilidades que suben.

En la demo puedes tirar mil veces con y sin contador de mala suerte y ver la diferencia donde importa: en la racha más larga sin premio.

Respuesta rápida

Con un 1 % plano, una de cada cien personas pasa de 450 tiradas sin premio. La solución estándar es un contador que sube la probabilidad conforme acumulas fallos y se reinicia al acertar. Eso corta la cola de golpe, pero también hace el objeto más frecuente: si quieres que siga siendo igual de raro, hay que bajar la probabilidad base para compensar.

Lo que necesitas antes de empezar

Paso 1: el problema, con números

Con una probabilidad plana p, la probabilidad de fallar n veces seguidas es (1 − p)ⁿ. Con el 1 %:

Tiradas sin premioCuánta gente llega ahí
5061 de cada 100
10037 de cada 100
20013 de cada 100
3005 de cada 100
4501 de cada 100

Ese 1 % final es el que escribe en el chat que tu juego está roto. Y no lo está: es que el azar puro tiene una cola muy larga, y en un juego con miles de jugadores esa cola le toca a alguien todos los días.

Curva de cuánta gente sigue sin premio según las tiradas, con azar plano y con contador

Paso 2: el contador de mala suerte

La idea: cada fallo sube un poco la probabilidad. Al acertar, vuelve al principio.

local BASE = 0.01          -- 1 % al empezar
local SUBIDA = 0.005       -- medio punto por cada fallo
local DESDE = 20           -- no empieza a subir hasta el fallo 20

local fallos = {}          -- fallos[jugador]

local function probabilidad(jugador)
	local n = fallos[jugador] or 0
	if n < DESDE then return BASE end
	return math.min(1, BASE + (n - DESDE) * SUBIDA)
end

local function tirar(jugador)
	local p = probabilidad(jugador)

	if math.random() < p then
		fallos[jugador] = 0
		return true
	end

	fallos[jugador] = (fallos[jugador] or 0) + 1
	return false
end

Con esos números, a partir de la tirada 20 la probabilidad sube medio punto cada vez, así que por la tirada 218 ya es imposible fallar. Nadie llega ahí: la gran mayoría acierta mucho antes, pero el suelo existe y eso cambia la sensación del juego por completo.

Paso 3: lo que nadie te cuenta del contador

Aquí va la parte incómoda, y es la que separa un artículo honesto de los otros cincuenta: el contador no es gratis. Simula esos mismos números y verás algo así:

Azar plano al 1 %Con contador
Tiradas de media hasta el premiounas 95unas 31
Peor racha en 50.000 tiradasmás de 500unas 70

La cola desaparece, sí. Pero el objeto ha pasado a salir tres veces más a menudo, porque a partir del fallo 20 la probabilidad se dispara. Si tu economía estaba pensada para un 1 %, acabas de triplicar la cantidad de legendarios que hay en tu juego sin querer.

La solución es compensar la base. Bajas la probabilidad de partida hasta que la media vuelva a donde estaba:

local BASE = 0.003        -- 0,3 % en vez de 1 %
local SUBIDA = 0.005
local DESDE = 60          -- y el contador entra más tarde

Con eso vuelves a tener una media parecida a la del 1 % plano, pero con un techo: nadie pasa de unas doscientas tiradas. Ese es el trato que hace el contador de mala suerte: no regala premios, redistribuye la suerte. Se la quita al afortunado y se la da al que lleva mala racha.

La demo de arriba te da las dos medias a la vez para que ajustes hasta que cuadren. Es literalmente el trabajo que hay que hacer antes de meter esto en un juego con economía.

Paso 4: elegir los tres números

  • DESDE: cuántas tiradas de azar puro antes de empezar a ayudar. Ponlo en torno al número de tiradas que consideras «normal» para conseguirlo.
  • SUBIDA: cuánto ayuda cada fallo. Cuanto más grande, antes se cierra la cola.
  • BASE: la probabilidad de partida, la que anuncias.

Y una regla honesta: si enseñas un porcentaje, que sea el de verdad. Si tu sistema tiene contador de mala suerte, dilo. «1 %, y sube si llevas mala racha» es más atractivo que un 1 % pelado, así que no hay motivo para esconderlo.

Paso 5: los topes

La otra mitad del problema es el jugador con suerte: el que saca tres legendarios en veinte tiradas y revienta tu economía. Un tope por sesión o por día:

local TOPE_DIARIO = 3
local sacadosHoy = {}      -- sacadosHoy[jugador] = {dia = ..., n = ...}

local function puedeSacarRaro(jugador)
	local hoy = math.floor(os.time() / 86400)
	local r = sacadosHoy[jugador]

	if not r then
		sacadosHoy[jugador] = {dia = hoy, n = 0}
		return true
	end
	if r.dia ~= hoy then
		r.dia = hoy
		r.n = 0
		return true
	end
	return r.n < TOPE_DIARIO
end

Cuando se llega al tope, lo elegante no es negar el premio: es cambiarlo por otra cosa buena (monedas, materiales). Que el jugador nunca sienta que ha tirado por nada.

Paso 6: el sistema de fichas

La tercera herramienta, y la más querida por los jugadores: además de la tirada, cada intento da una ficha. Con X fichas, eliges el objeto que quieras.

local FICHAS_PARA_ELEGIR = 60

local function alTirar(jugador)
	darFicha(jugador, 1)
	-- ...y la tirada normal
end

Esto convierte «a lo mejor nunca lo consigo» en «lo tengo en sesenta tiradas seguro». Cambia por completo la sensación, no cuesta nada de programar, y es lo que hacen los juegos que llevan años funcionando.

Paso 7: mirar tus propios números

Nada de lo anterior sustituye a medir. Guarda cuántas tiradas hacen falta en tu juego:

local historial = game:GetService("DataStoreService"):GetDataStore("Estadisticas_v1")

local function apuntar(tiradas)
	local ok = pcall(function()
		historial:IncrementAsync("tiradas_hasta_raro_total", tiradas)
		historial:IncrementAsync("veces_raro", 1)
	end)
end

Con esos dos números tienes la media real. Si no se parece a la teórica, algo está mal en tu código, no en la teoría.

Mil tiradas, dos sistemas

Lo que cambia el contador de mala suerte

Simula con azar plano y con contador. Mira las dos cosas: la peor racha (el jugador que se va) y la media (tu economía). El contador arregla la primera y te mueve la segunda.

Azar plano
Con contador de mala suerte
Dale a simular

Errores habituales

«Mi probabilidad es del 1 % pero nadie saca nada»

Comprueba que la tirada se hace una vez por intento y con el total de pesos bien sumado. El fallo clásico es sumar mal el total y que el último objeto de la tabla nunca salga.

El contador de mala suerte es del cliente

Entonces no existe: se reinicia solo, o se falsea. Va en el servidor y, si importa, al DataStore.

Se guarda el contador pero no se reinicia al acertar

Y a los dos días todo el mundo saca legendarios. Reinícialo en la misma función que da el premio.

La probabilidad sube tan rápido que el objeto raro deja de serlo

Es el problema del paso 3, y le pasa a casi todos la primera vez. Baja SUBIDA, sube DESDE o baja la base, y mira las dos medias en la demo antes de tocar el juego.

Los topes se aplican con el reloj del cliente

Igual que en las recompensas diarias: la hora buena es os.time() del servidor.

Anunciar un porcentaje distinto del real

Además de estar feo, es lo que hace que a la gente le pierdas la confianza para siempre. Si tienes contador, dilo.

Preguntas frecuentes

¿Cuál es la probabilidad «correcta» para un objeto raro?

No hay una. Piensa en tiempo: ¿cuántas horas quieres que cueste? Divide entre las tiradas por hora que da tu juego y ahí tienes la probabilidad.

¿El contador de mala suerte no es hacer trampas?

Es redistribuir la suerte, no regalarla: al que va bien le toca algo menos y al que lleva mala racha, algo más. Solo es trampa si mientes con el porcentaje. Dicho en voz alta, es una promesa: «no te vas a quedar tirado».

¿Debería ser el contador por objeto o general?

Por objeto o por categoría de rareza. Uno general se vuelve raro de entender: acabas subiendo la probabilidad de un legendario porque el jugador lleva mala racha con las pociones.

¿Y si tengo varios objetos legendarios?

Contador para «sacar algo legendario» y, cuando toca, elección aleatoria entre los legendarios. Y si quieres ser generoso, prioriza los que el jugador no tiene.


Última revisión: 2 de septiembre de 2026

Claim Your Loot

Explora otras secciones

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *