我正在编写一个脚本来随机化我的数组内部的数据,但是我得到了错误 那说
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 }
有任何帮助吗?如果我做错了什么?
答案 0 :(得分:3)
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
答案 1 :(得分:3)
如果您的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