How could I make this ChanceTable more efficient?

I have a table that holds a list of names for a wheel spin with each one having an individual chance to be chosen. But the next function will choose a random number and that number will determine the race the user gets. The catch is, I had to rewrite every individual name in the ChanceTable in the function that chooses the random number.

Is there anyway to work around this?

My code is seen below:

	local ChanceTable = {
		["Amida"] = 0.1,
		["Arcangelo"] = 0.2,
		["Inui"] = 0.3,
		["Shiba"] = 0.4,
		["Kisaki"] = 0.5,
		["Nakamura"] = 1,
		["Fujiwara"] = 5,
		["Sakura"] = 6,
		["Keisuke"] = 7,
		["Sano"] = 8,
		["Ryuguji"] = 9,
		["Kuwajima"] = 10,
		["Saito"] = 20,
		["Nakajima"] = 21,
		["Kurosaki"] = 22,
		["Suzuki"] = 23,
		["Gushiken"] = 24,
		["Sakai"] = 25,
		["Kirito"] = 60,
		["Asuna"] = 61,
		["Eguchi"] = 62,
		["Inoue"] = 63,
		["Kobayashi"] = 64,
		["Ebina"] = 65,
		["Hamasaki"] = 66,
		["Chiba"] = 67,
		["Sugimoto"] = 68,
		["Chisaki"] = 69,
		["Ishida"] = 70
	}
	
	local Race = 29
	
	local Number = Random.new():NextNumber(0, 100)
	if Number <= ChanceTable["Amida"] then
		Race = 1
	elseif Number <= ChanceTable["Arcangelo"] then
		Race = 2
	elseif Number <= ChanceTable["Inui"] then
		Race = 3
	elseif Number <= ChanceTable["Shiba"] then
		Race = 4
	elseif Number <= ChanceTable["Kisaki"] then
		Race = 5
	elseif Number <= ChanceTable["Nakamura"] then
		Race = 6
	elseif Number <= ChanceTable["Fujiwara"] then
		Race = 7
	elseif Number <= ChanceTable["Sakura"] then
		Race = 8
	elseif Number <= ChanceTable["Keisuke"] then
		Race = 9
	elseif Number <= ChanceTable["Sano"] then
		Race = 10
	elseif Number <= ChanceTable["Ryuguji"] then
		Race = 11
	elseif Number <= ChanceTable["Kuwajima"] then
		Race = 12
	elseif Number <= ChanceTable["Saito"] then
		Race = 13
	elseif Number <= ChanceTable["Nakajima"] then
		Race = 14
	elseif Number <= ChanceTable["Kurosaki"] then
		Race = 15
	elseif Number <= ChanceTable["Suzuki"] then
		Race = 16
	elseif Number <= ChanceTable["Gushiken"] then
		Race = 17
	elseif Number <= ChanceTable["Sakai"] then
		Race = 18
	elseif Number <= ChanceTable["Kirito"] then
		Race = 19
	elseif Number <= ChanceTable["Asuna"] then
		Race = 20
	elseif Number <= ChanceTable["Eguchi"] then
		Race = 21
	elseif Number <= ChanceTable["Inoue"] then
		Race = 22
	elseif Number <= ChanceTable["Kobayashi"] then
		Race = 23
	elseif Number <= ChanceTable["Ebina"] then
		Race = 24
	elseif Number <= ChanceTable["Hamasaki"] then
		Race = 25
	elseif Number <= ChanceTable["Chiba"] then
		Race = 26
	elseif Number <= ChanceTable["Sugimoto"] then
		Race = 27
	elseif Number <= ChanceTable["Chisaki"] then
		Race = 28
	elseif Number <= ChanceTable["Ishida"] then
		Race = 29
	end
1 Like

Since each species-chance-pair is in order of chance, you can use a for loop over the pairs until you find a pair whose chance is below the roll. E.g.

local roll = rng:NextNumber(0, 100)
local rolledSpecies
for species, chance in pairs(chanceTable) do
    if chance >= roll then
        rolledSpecies = species
        break
    end
end
2 Likes

This helps me out a lot, thank you so much!

1 Like

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.