从表中获取一个值,然后将其分配给另一个,没有重复

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

具体来说,这是针对Garry's Mod的,但是我认为在这个问题上没有太大的意义。我想要做的是得到一个玩家,并将其值设置给另一位随机玩家(因此,每个玩家都有一个随机的“目标”)。我想做到这一点而无需重复,这样就不会将玩家分配给自己。为了更好地说明:

“玩家分配说明。”

与这张图片的唯一区别是,我希望将每个玩家分配给另一个random玩家,所以更像是玩家1 =>玩家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
random lua lua-table garrys-mod
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.