【问题标题】:Lua: Is decreasing iterator from inside of loop possible?Lua:是否可以从循环内部减少迭代器?
【发布时间】:2014-05-26 14:33:37
【问题描述】:
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

【问题讨论】:

  • 虽然不是您问题的答案,但我相信您最好生成一个从 1 到 size 的数字列表,然后使用诸如 Fischer-Yates shuffle 之类的改组算法。

标签: lua iterator lua-5.1


【解决方案1】:

解决您的问题的方法是对数组进行洗牌,例如Random iteration to fill a table in Lua

回答您的问题,来自Lua 5.1 reference manual

§2.4.5 – 声明

所有三个控制表达式只计算一次,在循环开始之前。它们都必须产生数字。

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

【讨论】:

  • 我实际上只是想尝试一种不同的方法,而不仅仅是改组数组。感谢您直接回答我的问题:)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多