无限循环生成随机数?

时间:2017-12-14 10:00:31

标签: javascript arrays

我正在编写一个创建随机数学问题的脚本(简单问题)。问题是似乎存在无限循环,我无法弄清楚如果没有这部分代码,我的脚本可以在何处或如何运行。

https://codepen.io/abooo/pen/GyJKwP?editors=1010

var arr = [];
 var lastArr = [];


while(lastArr.length<122){
    arr.push('<br>'+Math.round(Math.random() * 10)+'+'+Math.round(Math.random() * 10)+'=');
  lastArr=removeDuplicates(arr);

}
document.write(lastArr.join(' '));

alert(arr.length);


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
}

3 个答案:

答案 0 :(得分:0)

Math.round(Math.random() * 10)将为您提供11种可能的结果(从010)。这意味着有11 * 11个非重复lastArr可以容纳。

正如评论中所提到的,它不仅需要很长时间才能发生,lastArr也不可能长于121(11 * 11),这意味着由于条件while(lastArr.length<122),您的循环无法结束。

除了有更好的方法来实现所需的结果,将代码更改为 this 将使其正常工作:

var arr = [];
var lastArr = [];


while(lastArr.length<121){  // Here I change 122 to 121
    arr.push('<br>'+Math.round(Math.random() * 10)+'+'+Math.round(Math.random() * 10)+'=');
  lastArr=removeDuplicates(arr);

}
document.write(lastArr.join(' '));

alert(arr.length);


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
}

答案 1 :(得分:0)

这是没有任何无限循环的工作片段。

&#13;
&#13;
var arr = [];
while(arr.length < 121){
  var randValue = '<br>'+Math.round(Math.random() * 10)+'+'+Math.round(Math.random() * 10)+'='
    arr.push();
    // Check duplicate elements before push
  if ( arr.indexOf(randValue) == -1 ) arr.push(randValue);
}
document.write(arr.join(' '));
alert(arr.length);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

看起来你正试图改变从0到10添加两个数字的每一个可能的结果。为什么不这样做,而不是你试图“将导弹投入pidgeonholes并希望最好”?

function generateArray(maxA, maxB) {
  var arr = [],
    a, b;
  for (a = 0; a <= maxA; a++) {
    for (b = 0; b <= maxB; b++) {
      arr.push([a, b]);
    }
  }
  return arr;
}

function shuffleArray(arr) {
  // simple Fisher-Yates shuffle, modifies original array
  var l = arr.length,
    i, j, t;
  for (i = l - 1; i > 0; i--) {
    j = Math.floor(Math.random() * (i + 1));
    t = arr[i];
    arr[i] = arr[j];
    arr[j] = t;
  }
}

function outputArray(arr) {
  var i, l = arr.length;
  for (i = 0; i < l; i++) {
    document.write("<br />" + arr[i][0] + " + " + arr[i][1] + " = ");
  }
}

var arr = generateArray(10, 10);
shuffleArray(arr);
outputArray(arr);