Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua数组洗牌不工作_Lua_Shuffle_Lua Table - Fatal编程技术网

Lua数组洗牌不工作

Lua数组洗牌不工作,lua,shuffle,lua-table,Lua,Shuffle,Lua Table,我当时正在编写一个脚本,将数组中的数据随机化,但我发现了一个错误 就是说 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 = mat

我当时正在编写一个脚本,将数组中的数据随机化,但我发现了一个错误 就是说

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 }
有什么帮助吗?如果我做错了什么?

1尝试将charName从string更改为数字

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
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
如果Lua版本<5.1,则没有运算符。请改用table.getn:

请注意,您的函数,虽然它确实洗牌周围的项目,但它并不真正洗牌所有元素。此外,由于每次迭代都会缩小范围,因此几乎肯定会多次交换阵列的前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
如果Lua版本<5.1,则没有运算符。请改用table.getn:

请注意,您的函数,虽然它确实洗牌周围的项目,但它并不真正洗牌所有元素。此外,由于每次迭代都会缩小范围,因此几乎肯定会多次交换阵列的前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

不能洗牌关联数组。为什么要在addState之后中断?你只需要一个随机玩家吗?为什么你有line local array=array?你使用的是哪个版本的Lua?@EgorSkriptunoff是的,只需要一个随机玩家。你不能洗牌关联数组。为什么在addState之后中断?您只需要一个随机播放器吗?为什么要使用line local array=array?使用的是哪个版本的Lua?@EgorSkriptunoff是的,只需要一个随机播放器。在我将charName从字符串更改为数字后,是否使用此播放器?还是没关系?如你所愿。在您的代码中,有一些奇怪的东西,比如localarray=array,它们导致了代码的不明确行为。你和我的功能非常相似,但我的阅读能力更好。顺便说一句,谷歌翻译很抱歉。在我把字符名从字符串改为数字后,我会用这个吗?还是没关系?如你所愿。在您的代码中,有一些奇怪的东西,比如localarray=array,它们导致了代码的不明确行为。你和我的功能非常相似,但我的阅读能力更好。另外,很抱歉谷歌翻译。