Lua:Возможно ли уменьшение итератора изнутри цикла?
Вопрос
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
Приведенный выше код предназначался для генерации массива случайных чисел от 1 до "размера", избегая повторяющихся значений.Я попытался добиться этого, повторив цикл 'for' верхнего уровня еще раз, если вновь сгенерированное значение присутствовало ранее где-то в массиве - уменьшив его итератор.Почему-то это не работает.Почему?
Невозможно ли изменить значение итератора изнутри цикла?
Пример вывода с повторяющимися значениями в массиве:
>lua5.1 "pairsss.lua"
2
1
10
6
5
2
5
7
7
4
>Exit code: 0
Решение
Решение вашей проблемы заключается в перетасовке массива, например Случайная итерация для заполнения таблицы в Lua.
Чтобы ответить на ваш вопрос, из Справочное руководство по Lua 5.1:
§2.4.5 – Для заявления
Все три управляющих выражения вычисляются только один раз, перед запуском цикла.Все они должны приводить к числам.
Это означает, что независимо от того, как вы изменяете значение i
внутри for
цикл, это не влияет на то, как выполняется итерация.
Другие советы
Вы можете использовать набор вместо массива, как это сделано автором вопросов Randomize числа в Луа без повторов ).