How would I achieve something like this with my current role giving system

What I am trying to do is to make it so that there are always 3 roles that players cannot get.
These three roles will be randomized every round.
How would I come close to achieving something like this?
Here is my module script:

local CardModule = {}

CardModule.RoleLimits = {
	["Werewolf"] = 2;
	["Villager"] = 1;
	["Hunter"] = 1;
	["Tanner"] = 1;
	["Seer"] = 1;
	["Minion"] = 1;
	["Drunk"] = 1;
	["Mason"] = 2;
	["Robber"] = 1;
	["Troublemaker"] = 1;
	["Insomniac"] = 1;
}

function shuffle(tbl)
	for i = #tbl, 2, -1 do
		local j = math.random(i)
		tbl[i], tbl[j] = tbl[j], tbl[i]
	end
	return tbl
end

function CardModule.CreateRoleDeck()
	local deck = {}
	for role, numCopies in pairs(CardModule.RoleLimits) do
		for _ = 1, numCopies do
			table.insert(deck, role)
		end
	end

	shuffle(deck)

	return deck
end

function CardModule.TakeCardFromDeck(deck)
	local k = #deck
	local card = deck[k]
	deck[k] = nil
	return card
end

return CardModule

I have a script that gets the roles from the module script:

local CardModule = require(game.ReplicatedStorage.ModuleScript)
-- GameController, a server script
local roleDeck = CardModule.CreateRoleDeck()
function startGame()
	local players = game.Players:GetPlayers()
	assert(#players <= #roleDeck, "Not enough roles for this many players!")


	for _, player in ipairs(players) do
		if player:FindFirstChildWhichIsA("StringValue") then
			print("wow")
			else
		local thing = game.Players[player.Name]
		local playerRole = CardModule.TakeCardFromDeck(roleDeck) 
		game.ReplicatedStorage.RoleNarraration:FireClient(player, playerRole)
		print(playerRole)
		print(player)
		local val = Instance.new("StringValue")
		val.Name = playerRole
		val.Parent = thing
	end
	end
end

The stringvalue is just so I can identify the role of a player in other scripts.

local RoleNames = {"Werewolf", "Villager", "Hunter", "Tanner", "Seer", "Minion", "Drunk", "Mason", "Robber", "Troublemaker", "Insomniac"}

local RoleLimits = {
	["Werewolf"] = 2;
	["Villager"] = 1;
	["Hunter"] = 1;
	["Tanner"] = 1;
	["Seer"] = 1;
	["Minion"] = 1;
	["Drunk"] = 1;
	["Mason"] = 2;
	["Robber"] = 1;
	["Troublemaker"] = 1;
	["Insomniac"] = 1;
}

for Count = 1, 3 do
	local RandomRole = math.random(#RoleNames)
	if RoleLimits[RandomRole] ~= 0 then
		RoleLimits[RandomRole] = 0
	end
end

This is how you could achieve this. Make sure that the “RoleLimits” dictionary isn’t being overridden though.

How would I access the roles that have not been chosen, though?

Get the roles of each player and compare them with the available roles.

That would have to include me knowing what the available roles are, though.

My question is to know what the available roles are.

Whatever roles don’t have a limit of 0.

I think you misunderstand, RoleLimits is so that each role has a limit to be given out. The numbers there are the limits.

But I can make another section inside the module for the roles that have been given out.

I dont understand how I would do that, though.