diff options
Diffstat (limited to 'src/common/random.lua')
-rw-r--r-- | src/common/random.lua | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/common/random.lua b/src/common/random.lua new file mode 100644 index 0000000..4fbbed3 --- /dev/null +++ b/src/common/random.lua @@ -0,0 +1,40 @@ +skycraft.random = { + choices = {}, + probabilities = {}, + csum = {}, + sum = 0 +} + +skycraft.random.__index = skycraft.random + +function skycraft.random:new(o) + o = o or {} + setmetatable(o, self) + o.choices = {} + o.probabilities = {} + o.csum = {} + o.sum = 0 + return o +end + +function skycraft.random:calc_csum() + self.sum = 0 + for i, choice in ipairs(self.choices) do + self.sum = self.sum + self.probabilities[choice] + self.csum[choice] = self.sum + end +end + +function skycraft.random:choose() + local r = math.random() + math.random(0, self.sum - 1) + for i, choice in pairs(self.choices) do + if r < self.csum[choice] then + return choice + end + end +end + +function skycraft.random:add_choice(choice, probability) + table.insert(self.choices, choice) + self.probabilities[choice] = probability +end |