有效地从lua表中删除零值

问题描述 投票:0回答:1

我对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)

但是由于随机函数返回相同的错误,因此也不起作用。谁能帮忙?

arrays random lua null roblox
1个回答
0
投票

您定义的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
© www.soinside.com 2019 - 2024. All rights reserved.