Is there a better way of making a fair 50/50 chance script without using math.random()?

I Made a lot of scripts using math.random() and most times it will only do one thing and not the other thing
Is there something else which will do a 50/50 chance and will be fair with both values?

Random is a feature that is different from math.random(), perhaps you could use it? It was introduced 3 years ago:

The other thing you need to think about is the count of outcomes. Thus you need to check for the condition of the output to choose A/B. Oh, and if the random is not truly random, set the math.randomseed(seed) to something, such as os.clock().

I thought they changed math.random()'s algorithm to the same one that Random uses years ago.

1 Like

It is now. They are exactly the same algorithm. There was a post which explained its differences well:

No, that’s just the way it is. There’s a 1 in 2 chance of retrieving one thing rather than another, this is susceptible of continuously picking the same result. For example, if you asked 10 people to pick between 1 and 2 there is a chance all will be 2.

However, you could potentially force it to choose the 2nd option if the 1st is chosen more than 3 times.

ie.

local last_picked = {};

local function last_three_equal(n)
    local total_picked = #last_picked;
    
    for i = total_picked, total_picked - 3, -1 do
        if (last_picked[i] ~= n) then
            return false;
        end
    end
    
    return true;
end

local function pick_option()
    local picked = math.random(2); --// Picks between [1, n]

    if (last_three_equal(picked)) then
        return picked == 2 and 1 or 2;
    end

    return picked;
end
2 Likes