# How To Make Rarity?

i need help making rarity work

``````local Ore_Chances = {
Coal = 0.8;
Copper = 0.5;
Gold = 0.25;
Diamond = 0.15;
}

local function OreRarity()
for name, chance in Ore_Chances do
local chosenRarity = (chance / 4) * 100
if chosenRarity == chance then
return chosenRarity
end
end
end
``````

the math works how i want but wont work since i want to return the name but chosenrarity wont ever be equal to chance because chance isn’t divided/multiplied

This is all i tried and all posts about rarity aren’t very good imo so any help would be awesome

Try returning name instead of chosenRarirty

I could be a bit confused on what your asking but if chosenrarity is never equal with chance, could you not just remove the if statement?

You want to use something called a “Weightage System”. Basically the key is the item and the value is it’s weight. The lower the weight the rarer it is. Then we will select a random number from 1 to the total of all weights combined. After that, we will make a var called counter to which we’ll be adding the weights to compare to the random nu,ber

``````local Ore_Chances = {
Coal = 0.8;
Copper = 0.5;
Gold = 0.25;
Diamond = 0.15;
}

local function OreRarity()
local randnum = Random.new(39473646824):NextNumber(0,1.7) -- 1.7 is total weight
local counter = 0
for name, weight in Ore_Chances do
counter += weight
if counter > randnum then
return name
end
end
end
``````

This is a very solid RNG system which should be good for general usage

2 Likes

It’d be better if you stated the Random.new() as a variable so all attempts use the same seed so there is no added randomness.

Nice of you to point that out. I’ll make that change now

1 Like
``````

function getWeightedRandom(weightedList)
local totalWeight = 0
for name, v in weightedList do
totalWeight = totalWeight + v
end

local randomWeight = math.random() * totalWeight
local currentWeight = 0

for name, v in weightedList do
currentWeight = currentWeight + v
if randomWeight <= currentWeight then
return name
end
end
end

local items = {
Gold = 10,
Iron = 20,
Silver = 70,
}
local randomValue = getWeightedRandom(items)
print("Random value:", randomValue)

``````