使用Javascript中的随机数和运算符生成随机数学公式

dav*_*rne 6 javascript string math prototype node.js

我想创建一个程序,应该打印出最简单的数学表达形式,如(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
Run Code Online (Sandbox Code Playgroud)

输入将是形式:例如

level 3
Run Code Online (Sandbox Code Playgroud)

输出应该是:

( 21 + 13 ) * 56 // Simple expression using Random no.s
Run Code Online (Sandbox Code Playgroud)

到目前为止,我可以创建没有括号的方程,但我需要帮助,这将给我可靠的解决方案

这是我到目前为止所做的:

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
    }  
}
Run Code Online (Sandbox Code Playgroud)

Ced*_*ach 6

我接受了@plamut 的想法来创建一个二叉树,其中每个节点代表一个具有左侧和右侧的运算符。

例如,方程2 * (3 + 4)可以看作

  *
 / \
2   +
   / \
  3   4
Run Code Online (Sandbox Code Playgroud)

您可以使用对象直接表示这一点,如下所示:

var TreeNode = function(left, right, operator) {
    this.left = left;
    this.right = right;
    this.operator = operator;

    this.toString = function() {
        return '(' + left + ' ' + operator + ' ' + right + ')';
    }
}
Run Code Online (Sandbox Code Playgroud)

然后您可以创建一个递归函数来构建这样的树,其中一个子树将具有所需节点总数的一半(= 等式长度):

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);
}
Run Code Online (Sandbox Code Playgroud)

这是一个带有工作示例的JSFiddle

也许您仍然想关心特殊情况,例如避免顶级括号,但从这里开始应该不会太难。