题
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就是这样的方式,如该帖子的答案之一(
不隶属于 StackOverflow