Murder Team isn’t randomized

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)

Can you not use somthing like this:

local Plr = game.Players:GetPlayers()

local RandomPlr = Plr[math.random(1, #Plr)]

No, If I did that it would print the same number repeatedly.

Did you set the seed? Normally math.random always returns a different number when called.

1 Like

just put this code into an interpreter (not roblox studio) and I got random results, did you do anything related to changing seeding or accidentally caching the random number?

local plrs = {
    "a",
    "b",
    "c",
    "d"
}

for i = 1, 10 do
    print(plrs[math.random(1, #plrs)])
end

Try using Random.new() to create a random object, and with the object, do RandomObject:NextInteger(min, max) to index the players.

1 Like

What is the issue with this? I’m still learning.

The thing is, I need to find the players who are playing right now,
I don’t know how to make a updating table of people who are playing the game

When you die or leave, you can remove them from the table.