Generación de Arrays de Números Aleatorios Únicos en Lua Dentro de un Rango Especificado

Métodos Disponibles

Se han identificado dos métodos principales para generar arrays de números aleatoricos únicos:

  1. Enfoque de Verificación: Generar números aleatorios y verificar si ya existen en la tabla. Si existen, generar otro número.
  2. 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.

Etiquetas: Lua aleatorios algoritmos Arrays

Publicado el 6-29 06:03