Is it possible to generate math questions procedurally?

I want to generate math questions procedurally for a small education game im making for the fun of it. Although I don’t have any idea on how to do this? Please give me info how to do so.

I don’t get what is so hard in that? If you want to do like basic sums / multiplications, then just generate a random sign using a table and choosing one from it and use math.random to choose the two random numbers.

3 Likes

But I dont want to have it be like “random number here” + “random number here” i also want the + to change into something else, thats what I dont know how to do. Because they’re not strings and I can’t generate them nor know how to.

I also need the answer to the equation as well its just I need the + to change for example.

You can have the different functions defined for the four operations or more if you need. And then assign them with keys in a table, then choose a random one from the table and pass the values and make the function do the math.

Example:

``````local function Add(a, b)
return a+b
end

--Functions for other sums here

local randomOperation = Operations[math.random(#Operations)]
randomOperation(math.random(100), math.random(100)) --Will run the function that was assigned to the random key it choose, and pass the two random numbers for the function to do the math.
``````

Not sure if this might be helpful to you but I tried making a function that generate random math problem with a settable range and stuff.

``````local AmountOfNumbers = 4 -- Amount of numbers for each problem
local RangeOfNumbers = {-10, 30} -- Random Range

local function GenerateMathProblem()
local PrintProblem
local TableOfNumbers = {}
for i = 1, AmountOfNumbers do
table.insert(TableOfNumbers, math.random(RangeOfNumbers[1], RangeOfNumbers[2]))
end
for _,Number in pairs (TableOfNumbers) do
if PrintProblem ~= nil then
local Sign = math.random(1, 2)
if Sign == 1 then
PrintProblem =
Number > 0
and tostring(PrintProblem) .. " + " .. Number
or tostring(PrintProblem) .. " + " .. "(" .. Number .. ")"
elseif Sign == 2 then
PrintProblem =
Number > 0
and tostring(PrintProblem) .. " - " .. Number
or tostring(PrintProblem) .. " - " .. "(" .. Number .. ")"
elseif Sign == 3 then
PrintProblem =
Number > 0
and tostring(PrintProblem) .. " * " .. Number
or tostring(PrintProblem) .. " * " .. "(" .. Number .. ")"
else
PrintProblem =
Number > 0
and tostring(PrintProblem) .. " / " .. Number
or tostring(PrintProblem) .. " / " .. "(" .. Number .. ")"
end
else
PrintProblem = tostring(Number)
end
end
print(PrintProblem)
end

GenerateMathProblem()
``````

Result:

I probably made a mistake around multiplication and division though.

maybe try using this as a ref? lol

3 Likes

That does not appear to respect order of operations (BEDMAS/PEMDAS/your regional variant). You could fix the underlying issue, but for simplicity’s sake it might be easier to just put parentheses around each operation. Something like `(((x ? y) ? z) ? a)` or whatever.

3 Likes