我正在制作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>
而不是仅在num1> num2时推送值,即使num1 <num2也可以这样做。
if(num1 < num2){
arr3.push(num2 + '-' + num1 + '=' );
}
让我们来看看你的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)
}
}