Lua数组洗牌不起作用。

我正在编写一个脚本来随机化数组内的数据,但是我收到了以下错误信息:

unexpected symbol near "#"

当我转到该行并删除 "#" 时,我得到了以下错误:

attempt to perform arithmetic on local `n' (a table value)

这是我的混洗功能

function shuffle(array)
    local array = array
    local n = #array
    local j
    local random = math.random
    for i=n-1, 1, -1 do
        j = random(i)
        array[j],array[i] = array[i],array[j]
    end
    return array
end

这是我想随机的内容

shuffle(new_players)
for name,character in pairs(new_players) do
    if (character.inside == true and character.death == 0) then
        local player = getPlayerByName(name, map_copy)
        if (player ~= nil) then
            addState(player)
            break
        end
    end
end

这是我的数组

new_players= { }
new_players[charName] = { death = 0, inside= true }

有帮助吗?如果我做错了一些事情呢?

点赞
用户1821428
用户1821428
  1. 尝试将 charName 从字符串更改为数字。

  2. 关于洗牌,你可以使用以下代码:

function swap(array, index1, index2)
    array[index1], array[index2] = array[index2], array[index1]
end

function shuffle(array)
    local counter = #array
    while counter > 1 do
        local index = math.random(counter)
        swap(array, index, counter)
        counter = counter - 1
    end
end
2013-06-15 06:10:01
用户1244588
用户1244588

如果你的 Lua 版本 < 5.1,那么就没有 # 运算符。可以使用 table.getn 替代:

local n = table.getn(array);

(更新)请注意,虽然你的函数确实会将项目打乱,但它并没有真正打乱所有元素。此外,由于你每次迭代都会缩小范围,所以几乎肯定会多次交换数组的前10%。现在,多次交换它们本身并不是坏事,但是与此相比,你几乎从不交换其他元素。

因此,解决此问题的一种选择是始终使用相同的随机变量范围。我甚至会更进一步,选择两个随机索引进行交换:

function shuffle(array)
    local n, random, j = table.getn(array), math.random
    for i=1, n do
        j,k = random(n), random(n)
        array[j],array[k] = array[k],array[j]
    end
    return array
end

另一种选择是从源数组中选择随机元素并将它们放入新的输出数组中:

local rnd,trem,getn,ins = math.random,table.remove,table.getn,table.insert;
function shuffle(a)
    local r = {};
    while getn(a) > 0 do
        ins(r, trem(a, rnd(getn(a))));
    end
    return r;
end
2013-06-16 13:49:06