在Javascript中使用随机数字和运算符生成一个随机math公式
我想创build一个程序,应该打印出最简单的mathexpressionforms,如(21 + 13)* 56使用随机号码。 1到100 ,程序必须采取一个级别参数, 级别决定生成方程的长度 ,例如:
游戏必须产生具有加法+乘法运算符的方程,如(21 + 13)* 56 (使用方括号)
----level 2 75 - 54 = 21 62 + 15 = 77 88 / 22 = 4 93 + 22 = 115 90 * 11 = 990 --level 3 ( 21 + 13 ) * 56 = 1904 82 - 19 + 16 = 79 51 * ( 68 - 2 ) = 3366
input将是forms:例如
level 3
输出应该是:
( 21 + 13 ) * 56 // Simple expression using Random no.s
到目前为止,我可以创build没有方括号的方程,但是我需要帮助,这将给我可靠的解决scheme
这是我迄今为止所做的:
var input = 'level 3' input = input.split(' ') var n = Number(input[1]) var x = ['/','*','-','+'] function randomNumberRange(min, max) { return Math.floor(Math.random() * (max - min) + min); } var a = '' for(var i=0;i<n;i++){ if(i !== n-1){ var n1 = randomNumberRange(1, 100) var m = randomNumberRange(0, x.length); var str = x[m]; a += n1 a +=' '+str+' ' }else{ a += n1 } }
我拿起@plamut的想法来创build一个二叉树,每个节点代表一个左侧和右侧的操作符。
例如,等式2 * (3 + 4)
可以被看作是
* / \ 2 + / \ 3 4
你可以使用下面的对象来表示这个非常简单的事情:
var TreeNode = function(left, right, operator) { this.left = left; this.right = right; this.operator = operator; this.toString = function() { return '(' + left + ' ' + operator + ' ' + right + ')'; } }
然后,您可以创build一个recursion函数来构build这样的树,其中一个子树将有一半的所需节点总数(=方程的长度):
function buildTree(numNodes) { if (numNodes === 1) return randomNumberRange(1, 100); var numLeft = Math.floor(numNodes / 2); var leftSubTree = buildTree(numLeft); var numRight = Math.ceil(numNodes / 2); var rightSubTree = buildTree(numRight); var m = randomNumberRange(0, x.length); var str = x[m]; return new TreeNode(leftSubTree, rightSubTree, str); }
这是一个带有一个工作示例的JSFiddle 。
也许你仍然想关心特殊情况,比如避免使用顶级的括号,但是从这里不应该太难。