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
有帮助吗?

解决方案

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

回答你的问题,来自 Lua 5.1参考手册:

§2.4.5 – For 语句

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

这意味着,无论你如何改变 i 在 - 的里面 for 循环,它不影响迭代的完成方式。

其他提示

您可以使用函数在Lua中随机化数字,没有重复。正如其中一个答案指出的那样,随着您的集合越来越较近您的Randome数字(例如,您有随机数1到100,您的设置为50),它将越来越难以找到一个数字尚未被选中。你可以看到一组大小50并从1到100挑选一个随机#然后你有一个半满的时间,你有25-50%的机会找到随机选择已经在你的中使用了放。在这种情况下,Shuffling就是这样的方式,如该帖子的答案之一(在没有重复的Lua中随机化数字)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top