首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >24数学游戏- Javascript中的随机数生成器和求解器

24数学游戏- Javascript中的随机数生成器和求解器
EN

Stack Overflow用户
提问于 2016-05-19 08:17:48
回答 4查看 1.9K关注 0票数 0

如何在Javascript中为第24游戏创建一个数字生成器?随机数生成器只应生成可解24的数字。只生成能解决问题的数字。

游戏规则:

你能得到4个号码。你得赚24块。你可以+,x,-和%这些数字得到24。

例子: 4,2,8,1

((4-2) + 1) x8= 24

随机数发生器应该给你4个数字,将组成24。您不能得到任何不等于24的数字,例如,1、1、1和2。

我只想用整数。

我想改变一下游戏。而不是总是使用24,我可能想使用一个不同的数字,如12为初学者和55高级球员,等等。

我是一个初学者,这是为了学习JavaScript。任何解释都会很好。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-05-19 12:55:46

这个小提琴展示了一种获取一系列数字的方法,这些数字可以以某种方式加到给定的数字上:

jsFiddle

这是一种获得“随机”数字的简单方法,因为我只需对随机操作进行求和,并在最后插入一个受控操作,以确保它能够生成想要的目标。

我将转储下面的源代码,供那些不想遵循链接的人使用:

代码语言:javascript
复制
console.clear();
function getNumberGame(target, length) {
    console.clear();
    var dataset = [];
    var methods = {
        'add' : function (a, b) {
            return (a + b);
        },
        'subtract' : function (a, b) {
            return a - b;
        },
        'multiply' : function (a, b) {
            if (a !== 0 && b !== 0 && a < Infinity && b < Infinity) {
                return Math.round(a * b);
            } else {
                return false;
            }
        },
        'divide' : function (a, b) {
            if (a !== 0 && b !== 0 && a < Infinity && b < Infinity) {
                return Math.round(a / b);
            } else {
                return false;
            }
        }
    }
    for (var i = 0; i < length - 1; i++) {
        var obj = {
            value : Math.round(Math.random() * target) + 1,
            method : Object.keys(methods)[Math.floor(Math.random() * Object.keys(methods).length)]
        };
        dataset.push(obj);
    }
    delete dataset[0].method;
    var data = dataset[0].value * 1;
    console.log('Start with ' + data);
    for (var i = 1; i < dataset.length; i++) {
        data = methods[dataset[i].method](data, dataset[i].value);
        console.log(dataset[i].method + " " + dataset[i].value + " to get " + data);
    }
    if (data > target) {
        dataset.push({
            value : Math.round(Math.abs(data - target)),
            method : 'subtract'
        });
        console.log("subtract " + dataset[dataset.length - 1].value + " to get " + target);
    } else if (data < target) {
        dataset.push({
            value : Math.round(Math.abs(data - target)),
            method : 'add'
        });
        console.log("add " + dataset[dataset.length - 1].value + " to get " + target);
    }
    var returnArray = [];
    while (dataset.length > 0) {
        var i = Math.floor(Math.random() * dataset.length);
        returnArray.push(dataset[i].value);
        dataset.splice(i, 1);
    }
    console.log(returnArray);
    alert("Make \"" + target + "\" by combining these " + length + ":\n" + returnArray.join(', '));
    return returnArray;
}

getNumberGame(parseInt(prompt("Target number", 24)), parseInt(prompt("Steps", 4)));

编辑1

注意,在Infinitydivide函数中没有检查multiplydivide,这可能导致一些奇怪的行为。在这种情况下,我的代码只返回0 (通过返回false)。

票数 3
EN

Stack Overflow用户

发布于 2016-05-19 09:05:00

编辑:原始文本在底部。

好的,所以我做了,我并不是很骄傲代码是多么的野蛮,我确信它可以在一千多个地方提高效率,但它有效。

代码语言:javascript
复制
//[A,B,C,D]

var skillLevel = 24;
numbers = [];
for (i=0;i<=3;i++){
    numbers[i] = (Math.floor(Math.random() * skillLevel) + 1);
}
function permutateOperations(numberArray){//This function, given an array of the form [A,B,C,D] where ABCD are numbers, places operations [+,-,*,%] between the numbers in the array
var possibilities = [];
var splicednumbers = numberArray.slice();
var operations = ['+','-','*','%'];
    for (var j=0;j<=3;j++){//[A,j,B,k,C,m,D]
        for(k=0;k<=3;k++){
            for(m=0;m<=3;m++){
                splicednumbers.splice(3,0,operations[m]);
                splicednumbers.splice(2,0,operations[k]);
                splicednumbers.splice(1,0,operations[j]);
                possibilities.push(splicednumbers);
                splicednumbers=numberArray.slice();
            }
        }
    }
    return possibilities;
}

function permutateNumbers(numberArray){//This function, given an array of the form [A,B,C,D], returns an array of arrays that have all the possible orderings
var possibility = [];
var possibilities = [];
var remainingArray=[];
var splicednumbers = numberArray.slice();
for (var i=0;i<=3;i++){
    threeRemain = splicednumbers.slice();//[A,B,C,D]
    possibility[0]=splicednumbers.splice(i,1)[0]; 
    for(var j=0;j<=2;j++){
        twoRemain=splicednumbers.slice();//[A,B,C]
        possibility[1]=splicednumbers.splice(j,1)[0]; 
        for(var k=0;k<=1;k++){
            oneRemain = splicednumbers.slice(); //[A,B]
            possibility[2]=splicednumbers.splice(k,1)[0];
            for(var m=0;m<=0;m++){
                possibility[3]=splicednumbers.splice(m,1)[0]; //[A]
                possibilities.push(possibility.slice());
            }
            splicednumbers=oneRemain.slice();
        }
        splicednumbers=twoRemain.slice();
    }
splicednumbers=threeRemain.slice();
}
return possibilities;
}

function permutateParenthesis(operationArray){//I AM SORRY THIS IS AWFUL BUT I COULDN'T THINK OF ANYTHING ELSE
//Given an array like [A,&,B,&,C,&,D], where ABCD are numbers and & is any operation, returns the 5 possible arrays that result from having parenthesis in different positions within it.
    saved = operationArray.slice();
    //[A,&,B,&,C,&,D]
    permutations = [];
    //First option
    operationArray.splice(0,0,"(");
    operationArray.splice(4,0,")");
    permutations.push(operationArray.slice());
    operationArray = saved.slice();
    //Second option
    operationArray.splice(0,0,"(");
    operationArray.splice(3,0,")");
    operationArray.splice(4,0,"(");
    operationArray.splice(10,0,")");
    permutations.push(operationArray.slice());
    operationArray = saved.slice();
    //Third option
    operationArray.splice(0,0,"(");
    operationArray.splice(6,0,")");
    permutations.push(operationArray.slice());
    operationArray = saved.slice();
    //Fourth option
    operationArray.splice(2,0,"(");
    operationArray.splice(7,0,")");
    permutations.push(operationArray.slice());
    operationArray = saved.slice();
    //Fifth option
    operationArray.splice(4,0,"(");
    operationArray.splice(8,0,")");
    permutations.push(operationArray.slice());
    operationArray = saved.slice();

    return permutations;
}
finalnumbers = permutateNumbers(numbers);
operationNumbers = [];
for (i=0;i<finalnumbers.length;i++){
    operationNumbers.push(permutateOperations(finalnumbers[i]));
}
parenthesisNumbers=[];
//Showtime
for (var j=0;j<operationNumbers.length;j++){
    for (var k=0;k<operationNumbers[j].length;k++){
        parenthesisNumbers.push(permutateParenthesis(operationNumbers[j][k]));
           if (eval(operationNumbers[j][k].join(""))===24){//get a string with the finished combination, eval it to perform the operation, see if it is 24
           console.log(operationNumbers[j][k].join("") + " Is valid");
           }
    }
}

原件:

我想这里的大多数人都错过了这个问题。

这里的问题不是产生24以下的随机数(考虑到数字50,6,6,2你可以做6*2* (50%6) = 24,我猜你确实需要一个上限)。

这里的问题是,在得到4个数字之后,检查它们是否可以在任何组合操作的情况下达到24,这要复杂得多。

你有4个运算+,-,*,%和4个数字A,B,C,D,对于初学者来说,你必须检查这两个集合的每一个组合,第一个可以重复(解决方案可能是+,+),第二个不能重复(即使数字可能重复每个数字的数量有限),这意味着对每个A、B、C、D、4*3*2*1的可能组合执行4*4*4 (+、-、*、%的每个组合)检查。这增加了1536个检查,然后试图使它在任何方面的效率。

然后,您必须开始考虑括号,这会使可能性增加一些。

我对此表示赞赏,我认为这是一个有趣的问题,但我同意libik的观点,如果你只想学习javascript,就有更简单的事情要做。

如果你选择前进,那么我希望我已经为你指明了正确的方向,如果可以的话,我很乐意帮助你,我可能真的会尝试自己解决这个问题,因为我认为这是一个有趣的问题。

票数 1
EN

Stack Overflow用户

发布于 2016-05-19 08:23:14

使用此方法在1和当前skillLevel之间生成随机数:

代码语言:javascript
复制
var skillLevel = getCurrentSkillLevel(); // get skill level in any way you seem appropriate.

function getRandomInt(skillLevel) {
    return Math.floor(Math.random() * skillLevel) + 1;
}

其中skillLevel是24,55或者什么的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37317622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档