Lua:Возможно ли уменьшение итератора изнутри цикла?

StackOverflow https://stackoverflow.com//questions/23029492

  •  21-12-2019
  •  | 
  •  

Вопрос

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 числа в Луа без повторов ).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top