random - simple - muestreo al azar en excel
Elige un elemento aleatorio de una tabla (3)
Mi objetivo es elegir un artículo al azar de una mesa en Lua.
Esto es lo que tengo hasta ahora, pero actualmente no funciona:
local myTable = { ''a'', ''b'', ''c'', ''d'' }
print( myTable[ math.random( 0, #myTable - 1 ) ] )
¿Cómo puedo corregir el código anterior para que funcione como estaba previsto? (¿O qué otro método podría usar?)
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 share que la solución original de share funcionaría perfectamente si todas tus claves son una secuencia de números que comienza en 1. Esto sucede cada vez que creas 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.
Lua indexa las tablas de 1, a diferencia de C, Java, etc., que indexa las matrices desde 0. Eso significa que, en su tabla, los índices válidos son: 1, 2, 3, 4. Lo que está buscando es lo siguiente:
print( myTable[ math.random( #myTable ) ] )
Cuando se llama con un argumento, math.random(n)
devuelve un entero aleatorio de 1 a n
incluido.
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 puede solucionarlo usted mismo.