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 到“大小”的随机数数组,避免重复值。如果新生成的值出现在数组中的某个位置之前,我试图通过再次重复顶级“for”循环来实现这一点——通过减少它的迭代器。不知何故,它不起作用。为什么?

从循环内部修改迭代器值是不可能的吗?

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

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

2 回答 2

2

您的问题的解决方案是对数组进行洗牌,例如随机迭代以填充 Lua 中的表格

要回答您的问题,请参阅 Lua 5.1 参考手册

§2.4.5 – 声明

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

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

于 2014-04-12T12:45:47.880 回答
2

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

于 2014-04-12T14:53:04.917 回答