JavaScript无限循环

问题描述 投票:2回答:2

我正在制作JavaScript算法,以随机顺序生成所有可能组合的简单数学问题(问题)。

e.x.

1+2

3+5

7+2

3+1

工作组合带有加号。问题是当我尝试用减号生成数字时。该算法应生成大于第二个的第一个数字

e.x.

firstNumber(更大)-secondNumber(低级)

5-3

4-1

2-5(不可能)

无论如何,代码执行无限循环,我无法弄明白。请提供工作示例的帮助。如果您有任何问题,请在评论部分写下。谢谢你的帮助:)

<html>
    <p id='plus10'></p>
    <p id='minus10'></p>
    <p id='plus100'></p>
    <p id='minus100'></p>

    <script>
        arr2 = [];
        var lastArr2 = [];
        var num1, num2;

        while(lastArr2.length < 121) {
            arr2.push('<br>' + Math.round(Math.random() * 10) + '+' + Math.round(Math.random() * 10) + '=');
            lastArr2 = removeDuplicates(arr2);
        }

        document.getElementById('plus10').innerHTML = (lastArr2.join(' '));

        arr1 = [];
        var lastArr1 = [];

        while(lastArr1.length < 121) {
            arr1.push('<br>' + Math.round(Math.random() * 100) + '+' + Math.round(Math.random() * 100) + '=');
            lastArr1 = removeDuplicates(arr1);
        }

        document.getElementById('plus100').innerHTML = (lastArr1.join(' '));

        arr3 = [];
        var lastArr3 = [];

        while(lastArr3.length < 121) {
            gen();
        }

        function gen() {
            //minus function
            num1 = Math.round(Math.random() * 10);
            num2 = Math.round(Math.random() * 10);

            if(num1 < num2) {
                gen();
            } else {
                lastArr3 = removeDuplicates(arr3);
                arr3.push(num1 + '-' + num2 + '=');
            }
        }

        document.getElementById('minus10').innerHTML = (lastArr3.join(' '));

        function removeDuplicates(arr) {
            let unique_array = []
            for(let i = 0; i < arr.length; i++) {
                if(unique_array.indexOf(arr[i]) == -1) {
                    unique_array.push(arr[i])
                }
            }
            return unique_array
        }
    </script>
</html>
javascript algorithm math
2个回答
0
投票

而不是仅在num1> num2时推送值,即使num1 <num2也可以这样做。

if(num1 < num2){
    arr3.push(num2 + '-' + num1 + '=' );
}

0
投票

让我们来看看你的while循环为0-10的负组合。

while (lastArr3.length < 121) {
  gen();
}

这里的问题是没有121个组合,所以lastArr3.length永远不会是121.使用加号组合,这是有效的,因为在0到10之间正好有121个2个数字的组合。但是,现在你已经消除了每个组合如果第一个数字小于第二个数字,则组合数量下降。

话虽如此,我可以建议一种更有效的方法来实现你想要做的事情吗?通过使用Math.random()生成数字,你会发现循环运行多长时间不一致。如何按顺序生成所有组合,然后将它们随机插入到数组中?

像这样的东西:

var arr = []
for (var i = 0; i <= 10; ++i) {
  for (var k = i; k <= 10; ++k) {
    var str = '<br>' + k + '-' + i + '='
    var index = Math.round(Math.random() * (arr.length - 1))
    arr.splice(index, 0, str)
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.