Module:IteratedProbability
		
		
		
		Jump to navigation
		Jump to search
		
This module is maintained on GitHub.
local IP = {
    INFINITY = 1 / 0,
}
local function isNatural(value)
    return type(value) == 'number'
       and math.floor(value) == value
       and value >= 0
end
local function isProbability(value)
    return type(value) == 'number'
       and 0 <= value
       and value <= 1
end
function IP.eachTry(baseProbability)
    assert(isProbability(baseProbability), 'baseProbability is not a probability')
    local count, sumSoFar = 0, 0
    return function ()
        local currentCount, currentSumSoFar = count, sumSoFar
        count = currentCount + 1
        sumSoFar = currentSumSoFar + baseProbability * (1 - baseProbability) ^ currentCount
        return currentCount, currentSumSoFar
    end
end
function IP.tryFor(count, baseProbability)
    assert(isNatural(count), 'count is not a natural number')
    for currentCount, iteratedProbability in IP.eachTry(baseProbability) do
        if currentCount >= count then
            return iteratedProbability
        end
    end
end
function IP.tryUntil(targetProbability, baseProbability)
    assert(isProbability(targetProbability), 'targetProbability is not a probability')
    if targetProbability == 1 and baseProbability < 1 then
        return IP.INFINITY
    end
    for count, iteratedProbability in IP.eachTry(baseProbability) do
        if iteratedProbability >= targetProbability then
            return count
        end
    end
end
return IP