具体来说,这是针对Garry的Mod,但是我不认为这个问题太重要了。我想要做的是获得一个玩家,并将其价值设置为另一个随机玩家(因此每个玩家都有一个随机的'目标')。我想这样做没有重复,所以玩家没有被分配给自己。为了更好地说明:
与该图片的唯一区别在于我希望每个玩家都被分配到另一个随机玩家,所以更像是player1 =>玩家5,玩家3 =>玩家2等。
这是我目前的代码,但是这总是让一个人不受欢迎:
validTargets = {}
TargetList = {}
local Swap = function(array, index1, index2)
array[index1], array[index2] = array[index2], array[index1]
end
GetShuffle = function(numelems)
local shuffle = {}
for i = 1, numelems do
shuffle[#shuffle + 1] = i
end
for ii = 1, numelems do
Swap(shuffle, ii, math.random(ii, numelems))
end
return shuffle
end
function assignTargets()
local shuffle = GetShuffle(#playing)
for k,v in ipairs(shuffle) do
TargetList[k] = v
end
SyncTargets()
end
function SyncTargets()
for k,v in pairs(TargetList) do
net.Start("sendTarget")
net.WriteEntity(v)
net.Send(k)
end
end
答案 0 :(得分:3)
我有一个lua函数,在给定n
的情况下生成从1到n
的随机数字随机数。
该方法基于popular algorithm来生成元素数组的随机排列。
您可以尝试使用它:
local Swap = function(array, index1, index2)
array[index1], array[index2] = array[index2], array[index1]
end
GetShuffle = function(numelems)
local shuffle = {}
for i = 1, numelems do
shuffle[#shuffle + 1] = i
end
for ii = 1, numelems do
Swap(shuffle, ii, math.random(ii, numelems))
end
return shuffle
end
function assignTargets()
local shuffle = GetShuffle(#playing) --assuming `playing` is a known global
for k,v in ipairs(shuffle) do
TargetList[k] = v
end
end