2

具体的には、これは Garry's Mod 用ですが、この問題ではそれほど重要ではないと思います。私がやりたいことは、1 人のプレーヤーを取得し、その値を別のランダムなプレーヤーに設定することです (したがって、すべてのプレーヤーがランダムな「ターゲット」を持ちます)。これを繰り返しなしで行いたいので、プレーヤーが自分自身に割り当てられないようにします。わかりやすく説明すると、次のようになります。

プレーヤーの割り当ての図。

その図との唯一の違いは、各プレーヤーを別のランダムなプレーヤーに割り当てたいということです。つまり、プレーヤー1 => プレーヤー 5、プレーヤー 3 => プレーヤー 2 などのようになります。

現時点での私のコードは次のとおりですが、これにより常に1人が選択されません。

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
4

1 に答える 1

3

n与えられた1 から までの数値のランダム シャッフルを生成する lua 関数がありますn。このメソッドは、要素の配列のランダム順列を生成する一般的なアルゴリズムに基づいています。

次のように使用してみてください。

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
于 2014-06-10T16:26:02.187 に答える