Lua:Es la disminución de iterador desde el interior de bucle posible?
Pregunta
array={}
size=10
math.randomseed(os.time())
for i=1,size do
array[i]=math.random(size)
if(i>1) then
for j=1,i do
if array[j]==array[i] then
i=i-1
break
end
end
end
end
for i=1,size do
print(array[i])
end
El código de arriba estaba destinado a generar una matriz de números aleatorios de 1 a 'tamaño', evitando la repetición de valores.Traté de lograr que mediante la repetición de nivel superior 'para' bucle, una vez más, si se acaba de generar valor estaba presente antes de que en algún lugar en la serie - por la disminución de su iterador.De alguna manera no funciona.Por qué?
Es la modificación de iterador de valor del interior del bucle no es posible?
Ejemplo de salida con la repetición de los valores en la matriz:
>lua5.1 "pairsss.lua"
2
1
10
6
5
2
5
7
7
4
>Exit code: 0
Solución
La solución a tu problema es la reorganización de la matriz, como Al azar de la iteración para rellenar una tabla en Lua.
Para responder a su pregunta, de Lua 5.1 manual de referencia:
§2.4.5 – Para La Declaración De
Todos los tres de control de las expresiones se evalúan sólo una vez, antes de que el bucle se inicia.Todos ellos han resultado en números.
Eso significa que, no importa cómo cambie el valor de i
dentro de la for
bucle, no afectan la manera en la iteración se realiza.
Otros consejos
Puede usar un conjunto en lugar de una matriz, como lo hace el autor de la pregunta Aleatorizan números en LUA sin repeticiones .Como se señala una de las respuestas, a medida que su conjunto se acerca de tamaño a su rango de números de Randome (por ejemplo, tiene números aleatorios de 1 a 100 y su conjunto es el tamaño 50) será cada vez más difícil encontrar un número queaún no ha sido recogido.Puede ver que para un conjunto de tamaño 50 y elegir un # aleatorio de 1 a 100, luego, cuando tenga la mitad de la mitad establecida, tiene una probabilidad de 25-50% de encontrar la selección aleatoria ya está en uso en sucolocar.En ese caso, Shuffling es el camino a seguir, como se explica en una de las respuestas a esa publicación ( aleatorizan números en LUA sin repeticiones ).