随机非重复数组javascript

时间:2017-10-11 04:32:00

标签: javascript arrays random

我正在尝试构建一个包含15个随机数的表,作为项目的一部分,用html / javascript制作15个益智游戏。我将在表格的前15个点中插入一个数组中的随机非重复数字。我似乎无法通过阵列获得警报。任何帮助,将不胜感激。谢谢!

编辑:现在我仍然有一些重复的数字。我不明白为什么,因为我很确定正在检查数组是否重复。

<script>

    var arr = [];
    function roll() {

        for (i = 0; i < 15; i++) {
  var randomNumber = Math.floor(Math.random() * 15) + 1;
            if (arr.indexOf(i) != randomNumber) {
                arr.push(randomNumber);

            }
        } alert("This Works" + arr);
    }

</script>

8 个答案:

答案 0 :(得分:0)

因为它永远不会结束循环。您可以在控制台中看到错误,例如Out of stack space。您已在roll条件下调用if函数。根据您使用if的计算,Math条件永远不会失败。删除方法调用并尝试运行,您将收到警报。

var arr = [];
function roll() {
    var randomNumber = Math.floor(Math.random() * 15) + 1;
    for (i = 0; i < 15; i++) {
        if (arr[i] != randomNumber) {
            arr[arr.length] = randomNumber;               
        }
    } alert("This Works" + arr);
} 

DEMO

答案 1 :(得分:0)

使用arr.indexOf检查数组中是否存在元素。并且不要将递归函数和循环一起用于单维数组操作。始终使用arr.push()方法插入最佳实践的数组

var arr = [];

function roll() {
  for (i = 0; i < 15; i++) {
    var randomNumber = Math.floor(Math.random() * 15) + 1;
    if (arr.indexOf(randomNumber) < 0) {
      arr.push(randomNumber);
    } else i--;
  }
  alert("This Works " + arr);
}
roll();

答案 2 :(得分:0)

你无法看到警报工作,因为你没有在任何地方调用你的roll()函数。 请参阅下面的代码。您的代码中有很多错误,例如函数是Math.floor,我的代码中未定义,也删除了函数调用roll内部的roll函数作为一个永无止境的循环,或者您必须将函数调用放入使其发挥作用的条件。

请参阅下面的更正代码。

<script>

var arr = [];
function roll() {
    var randomNumber = Math.floor(Math.random() * 15) + 1;
    for (var i = 0; i < 15; i++) {
        if (arr[i] != randomNumber) {
            arr[arr.length] = randomNumber;
        }
    } alert("This Works" + arr);
}
roll();

答案 3 :(得分:0)

你有一个错字。它应该是Math.floor而不是Math.Floor

你并没有在任何地方打破递归电话。因此,它将使最大调用堆栈大小超出错误。

我在下面的示例中使用了Array#find而不是传统的for loop

&#13;
&#13;
var arr = [];

function roll() {
  if(arr.length>=15){
    console.log(arr);
    return;
  }
  var randomNumber = Math.floor(Math.random() * 15) + 1;
  if(arr.find(elm => elm == randomNumber)==undefined){
    arr.push(randomNumber);
   }
   roll();
}
&#13;
<button onclick="roll();">Click</button>
&#13;
&#13;
&#13;

答案 4 :(得分:0)

//这是可以帮助您解决问题的代码

    var arr = [];
    function roll() {

        for (; ; ) {
            var randomNumber = Math.floor(Math.random() * 15) + 1;
            if(arr.indexOf(randomNumber) == -1){
                 arr[arr.length] = randomNumber;
                 if(arr.length == 15)
                    break;
            }
        } 
        alert(arr)
    }
    roll(); 

答案 5 :(得分:0)

你可以试试这个

var arr = [];

function roll() {
  for (i = 0; i < 15; i++) {
    var randomNumber = Math.floor(Math.random() * 15) + 1;
    if (arr.indexOf(randomNumber) < 0) {
      arr[arr.length] = randomNumber;
    }
  }
  alert("This Works " + arr);
}
roll();

答案 6 :(得分:0)

您正在获取重复项,因为您没有再次检查所有现有号码的新号码。希望这会有所帮助:

&#13;
&#13;
var arr = [];
function roll() {
  var randomNumber;
  do {
    randomNumber = Math.floor(Math.random() * 15) + 1;
    if (!arr.includes(randomNumber)) {
      arr.push(randomNumber);
    }
  } while (arr.length < 15)
  alert("This Works: " + arr);
}
roll();
&#13;
&#13;
&#13;

答案 7 :(得分:0)

使用tail recursion

function roll(size, arr) {
    arr = arr || [];
    if(size <= 0) return arr;
    return roll(size-1, arr.concat([Math.ceil(Math.random() * 15)]));
}

console.log("This Works: " + roll(15));
console.log("This Works: " + roll(10, []));

Math.floor(...) + 1已变为Math.ceil(...),因为两者都相同。