Here is a simple recursive method in javascript:
var genExpression = function(h){
var n = max(1,h + random(-2,0));
var s = "" + floor(random(1,11));
var a = ["+","-","*","/","^"];
var u = ["√","sin"];
for(var i = 0; i < n; i ++){
s += (" " + a[floor(random(0,a.length))]);
if(random() < 0.25 && h > 4){
s += (" " + u[floor(random(0,u.length))]);
s += ("(" + genExpression(h - 4) + ")");
s += (" " + a[floor(random(0,a.length))]);
}
if(random() < 0.5 && h > 3){
s += (" (" + genExpression(h - 2) + ")");
}
else{
s += (" " + floor(random(1,11)));
}
}
return s;
};
So genExpression(4)genExpression(4) might return something like "2 ^ (8 / 10 - 1 - 1) / 2 + 5 + (3 / 9 / 7) + √(2 ^ 3) ^ 5"2 ^ (8 / 10 - 1 - 1) / 2 + 5 + (3 / 9 / 7) + √(2 ^ 3) ^ 5.