【问题标题】:Getting one value from a table and assigning it to another with no repeats从表中获取一个值并将其分配给另一个而不重复
【发布时间】:2014-07-31 11:55:28
【问题描述】:

具体来说,这是针对 Garry's Mod 的,但我认为这在这个问题上并不重要。我想要做的是让一个玩家,并将他们的价值设置为另一个随机玩家(所以每个玩家都有一个随机的“目标”)。我想不重复地做到这一点,这样玩家就不会被分配给他们自己。为了更好地说明:

与那张图片的唯一区别是我希望将每个玩家分配给另一个随机玩家,所以更像是 player1 => player 5,player 3 => player 2,等等。 p>

这是我目前的代码,但这总是让一个人不被选中:

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】:

    我有一个 lua 函数,它生成从 1 到 n 的随机数字随机播放,给定 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
    

    【讨论】:

    • 好吧,我有点菜鸟。你能帮我在我自己的例子中使用它吗?
    • 假设你想每次更新TargetList,函数assignTargets和你的assignTargets做同样的事情:在你调用assignTargets之后,TargetList将被填充玩家分配的新随机洗牌。
    • 所以我只是把它插入而不是我的代码?我需要改变什么吗?抱歉 - 超级菜鸟就在这里。
    • 我刚刚尝试了代码,并得到“尝试调用全局'Swap'”。这不是默认功能吗?
    • 是的,抱歉,没有意识到我还有其他功能。但只是编辑了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多