Lua:从循环内部减少迭代器可能吗?

时间:2014-04-12 11:00:30

标签: lua iterator lua-5.1

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到'size'的随机数组,避免重复值。我试图通过重复顶级'for'循环来实现这一点,如果新生成的值存在于数组中的某个位置之前 - 通过减少其迭代器。不知怎的,它不起作用。为什么呢?

是否可以从循环内部修改迭代器值?

在数组中重复值的示例输出:

>lua5.1 "pairsss.lua"
2
1
10
6
5
2
5
7
7
4
>Exit code: 0

2 个答案:

答案 0 :(得分:2)

解决问题的方法是对数组进行随机播放,例如Random iteration to fill a table in Lua

Lua 5.1 reference manual

回答您的问题
  

§2.4.5 - 对于陈述

     

在循环开始之前,所有三个控制表达式仅被评估一次。它们必须全部产生数字。

这意味着,无论您如何更改i循环中for的值,它都不会影响迭代的完成方式。

答案 1 :(得分:2)

您可以使用集合而不是数组,正如问题Randomize numbers in Lua with no repeats的作者所做的那样。正如其中一个答案所指出的那样,随着你的集合越来越接近你的randome数字范围(比如,你有随机数1到100而你的集合大小为50),找到一个数字会越来越难还没有被选中。您可以看到,对于一组50的大小并从1到100选择一个随机#,那么当你设置半满时,你有25-50%的机会找到你已经在使用的随机选择组。在这种情况下,洗牌是要走的路,正如该帖子的一个答案(Randomize numbers in Lua with no repeats)中所解释的那样。