具体的には、これは 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