random - Lua-Obtener un valor de una tabla y asignarlo a otra sin repeticiones
lua-table garrys-mod (1)
Tengo una función lua que genera una mezcla aleatoria de números de 1 a n
, dado n
. El método se basa en un algoritmo popular para generar una permutación aleatoria de una matriz de elementos.
Puedes intentar usar eso así:
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
Específicamente, esto es para Garry''s Mod, sin embargo, no creo que eso importe demasiado en este problema. Lo que quiero hacer es obtener un jugador y establecer su valor a otro jugador aleatorio (para que cada jugador tenga un "objetivo" aleatorio). Quiero hacer esto sin repeticiones, y para que un jugador no se asigne a sí mismo. Para ilustrar mejor:
La única diferencia para esa imagen es que quiero que cada jugador sea asignado a otro jugador aleatorio , así que más como jugador1 => jugador 5, jugador 3 => jugador 2, etc.
Aquí está mi código en este momento, sin embargo, esto siempre deja a una persona sin marcar:
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