我对lua并不陌生,对编程也相当陌生。我正在努力实现以下目标。
我有一个数字表,我从中选择一个随机数。
myTable = {}
for i = 1 to 100 do
table.insert(myTable, i)
end
local numberChosen = myTable[math.random(#myTable)]
到目前为止,很好。下次选择一个数字时,我希望将该数字从表中删除。我知道lua不会删除值,它们会保持为零。所以
table.remove(myTable, numberChosen)
不起作用,因为当我尝试再次运行随机函数时,如果该值为nil,我得到““随机”的错误参数#1(间隔为空)“
我尝试创建这样的函数:
function cleanTable(t)
local cleanTable = {}
for k, v in ipairs(t)do
if v ~= nil then
table.insert(cleanTable, v)
end
end
return cleanTable
end
myTable = cleanTable(myTable)
但是由于随机函数返回相同的错误,因此也不起作用。谁能帮忙?
您定义的numberChosen
不正确。当您定义
local numberChosen = myTable[math.random(#myTable)]
您错误地将numberChosen定义为表中任意索引处的值。
让我们逐步执行代码的几个循环
Loop: 1 numberChosen: 1 #myTable 100
Loop: 2 numberChosen: 57 #myTable 99
Loop: 3 numberChosen: 20 #myTable 98
Loop: 4 numberChosen: 82 #myTable 97
Loop: 5 numberChosen: 60 #myTable 96
Loop: 6 numberChosen: 48 #myTable 95
Loop: 7 numberChosen: 35 #myTable 94
Loop: 8 numberChosen: 91 #myTable 93
Loop: 9 numberChosen: 82 #myTable 92
Loop: 10 numberChosen: 74 #myTable 91
Loop: 11 numberChosen: 17 #myTable 90
Loop: 12 numberChosen: 86 #myTable 89
Loop: 13 numberChosen: 70 #myTable 88
Loop: 14 numberChosen: 49 #myTable 87
Loop: 15 numberChosen: 30 #myTable 86
Loop: 16 numberChosen: 3 #myTable 85
Loop: 17 numberChosen: 10 #myTable 84
Loop: 18 numberChosen: 38 #myTable 83
Loop: 19 numberChosen: 16 #myTable 82
Loop: 20 numberChosen: 17 #myTable 81
Loop: 21 numberChosen: 100 #myTable 80
看看在循环21上发生的事情,我们有100,这是一个不存在的索引。我们从列表中删除了20个项目,因此列表只有80个项目。
因此我们不必将numberChosen
定义为myTable[math.random(#myTable)]
,而是定义为math.random(#myTable)
:
myTable = {}
for i = 1, 100 do
table.insert(myTable, i)
end
for i = 1, 100 do
local numberChosen = math.random(#myTable)
table.remove(myTable, numberChosen)
end