Hello I was wonder how I could change a decimal rarity to a 1 out of 100 for instance I am trying to make a infinite rarities like game

Hello I was wondering how I would change a percent/decimal chance to a 1 out of (number) for a game like infinite rarities. here is a example
image

This is the first module

local RarityPicking = {
	
}



function RarityPicking.chooseIndex (rarityTable, Luck)
	local newRarityArray = {}
	
	local totalWieght = 0
	
	for index, rarity in pairs(rarityTable) do
		local wieght = rarity[2]
		
		local NewWeight = wieght - Luck
		
		if NewWeight < 1 then
			continue
		end


		
		local fraction = (1/NewWeight)
		
		totalWieght += fraction
		
		newRarityArray[index] = {fraction}
		
	end
	
	local random = Random.new()
	local rnd = random:NextNumber(0, totalWieght)
	
	local selectRarity = "Coal"
	
	local AcummulateWeight = 0
	
	for index, rarity in pairs(newRarityArray) do
		AcummulateWeight += rarity[1]
		if rnd <= AcummulateWeight then
			selectRarity = index
			break
		end
	end
	for i,v in pairs(newRarityArray) do
-- This is where I was planning on doing the rarity thing for the gui
	end
	return selectRarity
end
return RarityPicking

This is the 2nd module that is for the actual rarities

local Rarities = {
	["Common"] = {1,1},
	["UnCommon"] = {1,3},
	["Rare"] = {1,6},
	["SuperRare"] = {1,24},
	["Cool"] = {1,41},
	["Epic"] = {1,64},
	["SuperEpic"] = {1,270},
	["Legendary"] = {1,648},
	["SuperLegendary"] = {1,2000},
	["UlraLegendary"] = {1,8000},
	["Mythic"] = {1,15000},
}

return Rarities```

Now I am trying to make it so it can figure out this rarity for what it would be with luck

if you need more information just ask please and thankyou for your support!!!
2 Likes

Now I am trying to make it so it can figure out this rarity for what it would be with luck

if you need more information just ask please and thankyou for your support!!!
[/quote]

1 Like

I answered something very similar to this a couple hours ago, take a look because I think it effectively accounts for rarities (weights) in probability and selection:

Nevermind I think I misunderstood. Are you trying to convert a decimal to its fractional representation or apply a ‘luck’ to a set of weights?

1 Like

yeah I am basically trying to convert it to a fraction using weighted luck but make the 2 numbers in the fraction separated by a comma , instead of a slash /

1 Like

i figured out a weighted rarity system already

1 Like

You can apply a luck effect to any given table of weights with a variety of methods. Here, I simply calculated the average of all weights and made the luck value act as an alpha for how close each weight gets to the ‘normalized’ average:

local selection = {
	['godly fish'] = 1;
	['golden fish'] = 100;
	['talapia rizz'] = 500;
	['cod modern warfare'] = 1200;
	['stank tuna'] = 3000;
	['a rock'] = 5000;
};

local function applyLuck(weights: { [string]: number }, luck: number)
	local sum = 0;
	local count = 0;
	
	for _, weight in weights do
		sum += weight;
		count += 1;
	end
	
	local avg = sum / count;
	
	local newWeights = {};
	
	for item, weight in weights do
		newWeights[item] = weight + (avg - weight) * luck; --simple lerping of each weight to the normalized average
	end
	
	return newWeights;
end

applyLuck(selection, .5); --returns a new table of weights that are considered to be affected with 50% luck

Result of the function call:
image

This satisfies the notion of luck decreasing the odds of more common elements in the table and increasing the odds of less common elements. Keep in mind that you may want to implement a different logic for luck since this method is rather rudimentary.

As for expressing a weight in terms of a fraction with 1 as the numerator, simply determine the odds (that sum to 1) in decimal form by dividing each weight by the sum of all weights, then find the reciprocal of each decimal (1 / decimal) which serves as the denominator of the fraction:

local function asFractions(weights: { [string]: number })
	local sum = 0;
	
	for _, weight in weights do
		sum += weight;
	end
	
	local fractions = {};
	
	for item, weight in weights do
		fractions[item] = '1 , ' .. sum / weight; --calculation here is equivalent to 1 / (weight / sum)
		--not sure why but you wanted a comma instead of a slash
	end
	
	return fractions;
end

asFractions(selection);

Result of the function call:
image

The fractions here obviously aren’t visually appealing because the weights used don’t seamlessly convert to perfect fractions. Try playing around a little with the weights (such as changing them to fractions that perfectly add to a power of 10). If you don’t understand something, I can probably clarify if you let me know.