Script is fairly simple. Get two players, assign them a value, put the rest on their own spawns.

The issue is, that person designated as 'Sniper' is also being put with the unassigned players. And one player who is unassigned is not being moved and is staying at the spawn.

while wait() do
	local players = game:GetService('Players'):GetPlayers()
	if #players >= 3 then
		
		wait(30)		
		
		local vip = table.remove(players,math.random(#players))
		local sniper = players[math.random(#players)]
		
		vip.Values:WaitForChild('teamValue').Value = 'Vip'
		local t = vip.Character:FindFirstChild("Torso")
		local h = vip.Character:FindFirstChild("Head")
		if vip.Character and vip.Character.Torso then
		t.CFrame = game.Workspace:WaitForChild('Spawns').VipSpawn.CFrame + Vector3.new(0,3.2,0)
		end
		
		sniper.Values:WaitForChild('teamValue').Value = 'Sniper'
		local t = sniper.Character:FindFirstChild("Torso")
		local h = sniper.Character:FindFirstChild("Head")
		if sniper.Character and sniper.Character.Torso then
		t.CFrame = game.Workspace.Spawns.SniperSpawn.CFrame + Vector3.new(0,3.2,0)
		end
		
		for k,v in pairs(players) do
			if v.Values.teamValue ~= 'Vip' and v.Values.teamValue ~= 'Sniper' then
				local t = v.Character:FindFirstChild('Torso')
				if t then
					t.CFrame = game.Workspace.Spawns.GuardSpawn['GuardSpawn'..k].CFrame + Vector3.new(0,3.2,0)
				end
			end
		end
		wait(100)
		
	end
end

Thanks :3