Murder Team is not random

I made a script that runs vote system and puts players in a map with a random killer. The problem is the killer isn’t random. It just repeats the same killer after the round is ended.

Here is the script

local rep = game:GetService("ReplicatedStorage")
local plrs = game:GetService("Players")
local votingSystem = game.Workspace.Voting
local status = rep.Status

local redTeam = game.Teams["Killer"]
local blueTeam = game.Teams["Runner"]
local blueTeamColor = BrickColor.new ("Lime green")
local redTeamColor = BrickColor.new ("Really red")

local lobbyTeam = game.Teams.Lobby

local choices = votingSystem:GetChildren()
local maps = rep.Maps:GetChildren()

local intermission = 10

local isAnOption
local randomMap

local chosenMap
local mapClone

local BlueTeamCount
local RedTeamCount


-- picking a random map function
local function PickRandomMap ()

	local randomNumber = math.random(1, #maps)

	randomMap = maps[randomNumber]

	return randomMap.CanBeVoted
end


for i, choice in pairs(choices) do

	local name = choice.label.SurfaceGui.TextLabel
	local picture = choice.Image.SurfaceGui.ImageLabel

	isAnOption = PickRandomMap()

	if isAnOption.Value == true then
		repeat 
			isAnOption = PickRandomMap()
		until
		isAnOption.Value == false
		name.Text = randomMap.Name
		picture.Image = randomMap.Image.Value
		randomMap.CanBeVoted.Value = true

	else
		name.Text = randomMap.Name
		picture.Image = randomMap.Image.Value
		randomMap.CanBeVoted.Value = true		
	end					
end	


rep.InRound.Changed:Connect(function()

	if rep.InRound.Value == false then

		mapClone:Destroy()

		for i, map in pairs(maps) do
			map.CanBeVoted.Value = false
		end

		for i, choice in pairs(choices) do

			local name = choice.label.SurfaceGui.TextLabel
			local picture = choice.Image.SurfaceGui.ImageLabel

			isAnOption = PickRandomMap()

			if isAnOption.Value == true then
				repeat 
					isAnOption = PickRandomMap()
				until
				isAnOption.Value == false
				name.Text = randomMap.Name
				picture.Image = randomMap.Image.Value
				randomMap.CanBeVoted.Value = true

			else
				name.Text = randomMap.Name
				picture.Image = randomMap.Image.Value
				randomMap.CanBeVoted.Value = true		
			end					
		end	


	else

		-- after the intermission has ended, the round will soon begin
		--- when the map with most votes will be spawned

		local Choice1Votes = #votingSystem.Choice1.button.Votes:GetChildren()
		local Choice2Votes = #votingSystem.Choice2.button.Votes:GetChildren()
		local Choice3Votes = #votingSystem.Choice3.button.Votes:GetChildren()

		if Choice1Votes >= Choice2Votes and Choice1Votes >= Choice3Votes then

			chosenMap = votingSystem.Choice1.label.SurfaceGui.TextLabel.Text

		elseif Choice2Votes >= Choice1Votes and Choice2Votes >= Choice3Votes then

			chosenMap = votingSystem.Choice2.label.SurfaceGui.TextLabel.Text

		else

			chosenMap = votingSystem.Choice3.label.SurfaceGui.TextLabel.Text

		end

		-- shows which map has won

		status.Value = "The Chosen map is: ".. chosenMap

		--- getting the map from the replicated storgae to the workspace

		for i, map in pairs(maps) do
			if chosenMap == map.Name then
				mapClone = map:Clone()
				mapClone.Parent = game.Workspace
			end
		end	

		--[[ another short delay right before the players get teleported you would also need to add 
		the same delay on the round system script]]
		wait(1.5)

		-- clears all the votes for next round

		for i, choice in pairs(choices) do
			choice.label.SurfaceGui.TextLabel.Text = " "
			choice.Image.SurfaceGui.ImageLabel.Image = " "
			choice.button.Votes:ClearAllChildren()
			rep.VoteReset:FireAllClients(choice.button)
		end

		-- this is if there are no teams wit dedicated spawns (free for all):

		--local spawns = mapClone.Spawns:GetChildren()
------------------
            ------
            -----
            -- Test hehehe
            -----------
		local BlueTeamCount = {}
		local RedTeamCount = {}

		for i, plr in pairs(plrs:GetChildren()) do

			local char = plr.Character
			local humanRoot = char:WaitForChild("HumanoidRootPart")
			local nameGui = char.Head:FindFirstChild("NameGUI")

			local RedSpawns = mapClone.RedSpawns:GetChildren()
			local BlueSpawns = mapClone.BlueSpawns:GetChildren()

			-- picks a random spawn from each team
			local randomRedSpawn = RedSpawns[math.random(1,#RedSpawns)]
			local randomBlueSpawn = BlueSpawns[math.random(1,#BlueSpawns)]
--------------------------------------------
-------------------------------------------------------- Random Teams Rewrite ------------------------------------------------------
--------------------------------------------
			if #RedTeamCount == 1 then

				plr.Team = blueTeam
				-- this is so we can make the spawn location for each player more randomized
				humanRoot.CFrame = randomBlueSpawn.CFrame + Vector3.new(math.random(1,3),math.random(1,3),math.random(1,3))
				plr.CameraMode = "Classic"
				plr.CameraMaxZoomDistance = 9
				table.insert(BlueTeamCount, plr.Name)
				if nameGui then
					nameGui.name.TextColor3 = blueTeamColor
				end
				print(plr.Name .. " put in ".. plr.Team.Name)

			elseif #RedTeamCount == 0 then

				plr.Team = redTeam
				plr.CameraMode = "LockFirstPerson"
				plr.CameraMaxZoomDistance = 0.5
				humanRoot.CFrame = randomRedSpawn.CFrame + Vector3.new(math.random(1,3),math.random(1,3),math.random(1,3))

				table.insert(RedTeamCount, plr.Name)

				if nameGui then
					nameGui.name.TextColor3 = redTeamColor
				end

				print(plr.Name .. " put in ".. plr.Team.Name)

				-- if both teams have the same amount of players, it choses a random team using math.random

			else

				local u = 0

local function chosen(x,y)
   u = u + 1
   if x ~= nil and y ~= nil then
      return math.floor(x + (math.random(math.randomseed(os.time()+u))*999999 %y))
   else
      return math.floor((math.random(math.randomseed(os.time()+u))*100))
   end
end
                    for _,v in pairs(game.Players:GetChildren()) do
                        
				if v == chosen(1,#game.Players:GetChildren()) then

					v.Team = redTeam
					humanRoot.CFrame = randomRedSpawn.CFrame + Vector3.new(math.random(1,3),math.random(1,3),math.random(1,3))
					v.CameraMode = "LockFirstPerson"
					v.CameraMaxZoomDistance = 9

					table.insert(RedTeamCount, v.Name)

					if nameGui then
						nameGui.name.TextColor3 = redTeamColor
					end

					print(v.Name .. " put in ".. v.Team.Name)
                elseif v ~= chosen then
                       v.Team = blueTeam
                       v.CameraMode = "Classic"
                       v.CameraMaxZoomDistance = 9
                       humanRoot.CFrame = randomBlueSpawn.CFrame + Vector3.new(math.random(1,3),math.random(1,3),math.random(1,3))

					table.insert(BlueTeamCount, v.Name)
					if nameGui then
						nameGui.name.TextColor3 = blueTeam
					end
					print(v.Name .. " put in ".. v.Team.Name)                
                            end
                        end
                    end
             
			--------- if the player dies, it puts them back in the lobby and removes them from the team

			-- when a player has died
print("Not Printing Char")
                        char:WaitForChild("Humanoid").Died:Connect(function()
                             
                print("Working")
				plr.Team = lobbyTeam
				plr.CameraMode = "Classic"
				plr.CameraMaxZoomDistance = 9


			end)
		end	
	end
end)

I don’t know why you are making this so complicated. You can simply do:

local killer = game.Players:GetPlayers()[math.radom(#game.Players:GetPlayers())]

for _,v in pairs(game.Players:GetPlayers()) do
	local humanRoot = v.Character.HumanoidRootPart
	if v == killer then
		v.Team = redTeam
		humanRoot.CFrame = randomRedSpawn.CFrame + Vector3.new(math.random(1,3),math.random(1,3),math.random(1,3))
		v.CameraMode = "LockFirstPerson"
		v.CameraMaxZoomDistance = 9

		table.insert(RedTeamCount, v.Name)

		if nameGui then
			nameGui.name.TextColor3 = redTeamColor
		end

		print(v.Name .. " put in ".. v.Team.Name)
	elseif v ~= killerthen
		v.Team = blueTeam
		v.CameraMode = "Classic"
		v.CameraMaxZoomDistance = 9
		humanRoot.CFrame = randomBlueSpawn.CFrame + Vector3.new(math.random(1,3),math.random(1,3),math.random(1,3))

		table.insert(BlueTeamCount, v.Name)
		if nameGui then
			nameGui.name.TextColor3 = blueTeam
		end
		print(v.Name .. " put in ".. v.Team.Name)                
	end
end

Thats not going to work. The reason it’s not a variable is because when you make a math.random variable, you are storing the first random number and it will keep repeating the same thing. My function is supposed to randomize so no one gets chosen killer twice. It doesn’t look that complicated to me

No, I meant for you to replace them for loop inside of the changed connection. This doesn’t store the killer variable either. Every time the round starts, it will randomize it using this. Your problem is that you compare a player to a number, making that false, but you also try to compare the player to the chosen function, leading it to false, therefore not changing the team.

But it does change the team. I’m confused. the problem is with the randomizer. It’s not actually random.