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
- La tabla de pesos: rarezas con probabilidades reales.
- Unos 25 minutos, y ganas de mirar números.
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 premio | Cuánta gente llega ahí |
|---|---|
| 50 | 61 de cada 100 |
| 100 | 37 de cada 100 |
| 200 | 13 de cada 100 |
| 300 | 5 de cada 100 |
| 450 | 1 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.

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 premio | unas 95 | unas 31 |
| Peor racha en 50.000 tiradas | más de 500 | unas 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.
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





Deja una respuesta