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
答案 0 :(得分:2)
解决问题的方法是对数组进行随机播放,例如Random iteration to fill a table in Lua。
回答您的问题§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)中所解释的那样。