2010-06-07 26 views
26

Mi objetivo es seleccionar un elemento aleatorio de una tabla en Lua.Elija un elemento aleatorio de una tabla

Esto es lo que tengo hasta ahora, pero que actualmente no funciona:

local myTable = { 'a', 'b', 'c', 'd' } 
print(myTable[ math.random(0, #myTable - 1) ]) 

¿Cómo puedo solucionar el código de seguridad para que funcione como se pretende? (O lo que otro método podría usar?)

+1

Pensé que me gustaría añadir a esto. Sí, de manera predeterminada, el primer índice en una matriz de lua es 1. Sin embargo, puede hacer que comience en 0 como lo siguiente: array = {[0] = 'a', 'b', 'c'} print (array [0 ]) >> a 'b' seguirá el juego en el índice 1 y 'c' en el índice 2 ... – user3113401

Respuesta

2

prueba:

t = {'a', 'b', 'c'} 
print(t[0]) 

da nil. Es decir, 0 está fuera de límites (prueba t[20]) ... así que aleatorio debe ser de 1 a #myTable (inclusive), por lo que puedes solucionarlo tú solo.

55

Lua indexa las tablas de 1, a diferencia de C, Java etc. que indexa las matrices de 0. Eso significa, que en su tabla, los índices válidos son: 1, 2, 3, 4. Lo que está buscando es el siguiente:

print(myTable[ math.random(#myTable) ]) 

Cuando se llama con un argumento, math.random(n) devuelve un número entero aleatorio 1-n incluyendo.

6

Creo que la pregunta también necesita una respuesta más general. No hay ninguna limitación en las tablas lua para ser construidas con una secuencia de enteros a partir de 1. Las claves pueden ser cualquier cosa, ¡incluso podrían ser otras tablas lua! En tales casos, funciones como #myTable pueden dar una respuesta que no espera (cuando se usa sin ninguna funcionalidad de metataxis personalizada). La única manera confiable de obtener todas las claves en una tabla es iterar sobre ella:

-- iterate over whole table to get all keys 
local keyset = {} 
for k in pairs(myTable) do 
    table.insert(keyset, k) 
end 
-- now you can reliably return a random key 
random_elem = myTable[keyset[math.random(#keyset)]] 

También voy a añadir que la solución original por Michal Kottman funcionaría perfectamente si todas las llaves son una secuencia de números a partir de 1. Esto sucede cada vez que crea una tabla como myTable = {'a','b','c'}. Entonces, para las situaciones donde las tablas se construyen de esta manera, obtener elementos aleatorios de la tabla sería más rápido a su manera.

Cuestiones relacionadas