Métodos Disponibles
Se han identificado dos métodos principales para generar arrays de números aleatoricos únicos:
- Enfoque de Verificación: Generar números aleatorios y verificar si ya existen en la tabla. Si existen, generar otro número.
- Enfoque de Selección: Crear primero una tabla con todos los números consecutivos dentro del rango, luego seleccionar elementos aleatoriamente mientras se eliminan los seleccionados de la tabla original.
Requisitos del Problema
El objetivo es generar una cantidad específica de números únicos aleatorios dentro de un rango determinado. Los escenarios pueden variar:
- Generar 10 números aleatorios únicos entre 1 y 100
- Generar 10 números aleatorios únicos entre 1 y 1000
- Generar 10 números aleatorios únicos entre 1 y 15
El primer método funciona bien cuando el rango es grande en comparación con la cantidad de números solicitados. Sin embargo, cuando el rango es pequeño (como en el tercer ejemplo), el primer método tiene una alta probabilidad de generar duplicados, lo que resulta en un rendimiento deficiente o incluso un bloqueo del sistema.
Implementación
A continuación se presenta el código para ambos métodos:
Método 1: Enfoque de Verificación
-- Función para generar números aleatorios únicos entre min y max
function numerosAleatoriosUnicos(min, max, cantidad)
-- Verificar si es posible generar la cantidad solicitada sin duplicados
if cantidad > (max - min + 1) then
return {}
end
local resultado = {}
local usados = {}
math.randomseed(os.time()) -- Inicializar semilla aleatoria
while cantidad > 0 do
local numero = math.random(min, max)
if not usados[numero] then
table.insert(resultado, numero)
usados[numero] = true
cantidad = cantidad - 1
end
end
return resultado
end
Método 2: Enfoque de Selección
-- Función para crear una tabla con números consecutivos
function crearTablaNumeros(inicio, fin)
local tabla = {}
for i = inicio, fin do
table.insert(tabla, i)
end
return tabla
end
-- Función para generar números aleatorios únicos usando el enfoque de selección
function seleccionAleatoria(min, max, cantidad)
-- Crear tabla con todos los números posibles
local numerosDisponibles = crearTablaNumeros(min, max)
-- Verificar si se solicitan todos los números
if cantidad >= (max - min + 1) then
return numerosDisponibles
end
local resultado = {}
math.randomseed(os.time()) -- Inicializar semilla aleatoria
while cantidad > 0 do
-- Seleccionar un índice aleatorio de los números disponibles
local indice = math.random(1, #numerosDisponibles)
table.insert(resultado, numerosDisponibles[indice])
table.remove(numerosDisponibles, indice)
cantidad = cantidad - 1
end
return resultado
end
Ejemplo de Uso
-- Ejemplo con el primer método
local array1 = numerosAleatoriosUnicos(11, 25, 6)
for i = 1, #array1 do
print(array1[i])
end
print("...........")
-- Ejemplo con el segundo método
local array2 = seleccionAleatoria(11, 25, 6)
for i = 1, #array2 do
print(array2[i])
end
El segundo método es más eficiente cuando el rango de números es pequeño en comparación con la cantidad de números solicitados, ya que evita la repetición innecesaria de números ya generados.