在我的Javascript程序中失去了逻辑

Losing the logic in my Javascript program

本文关键字:失去 我的 Javascript 程序      更新时间:2023-09-26

我对Javascript有问题。我想制作一个程序,它生成6个随机数(从1到49)。无论如何,我用for循环来做,它能工作。但当我试图找出这6个数字中的任何一个是否有重复的数字时,用一个新的随机数替换它。我已经研究过js数组的重复函数,我正在应用它,但似乎我的错在逻辑上,仍然是js的初学者,所以请帮助我:)

js代码:

var arr = new Array(7);
var numbers = [];
for(var i=1; i<arr.length;i++){
    numbers[i] = Math.floor(Math.random()*48)+1;
    if(numbers[i] == numbers[i+1]){
        arr.indexOf(numbers[i]);
        arr.push(Math.floor(Math.random()*48));
    }
}

我正在尝试应用indexOf(查找重复数字的索引,然后通过push()将其替换为新元素)。请给我一些如何提高编程逻辑技能的建议:(

首先,JavaScript数组是零索引的,所以第一个索引是0,而不是1。尽管跳过第一个索引并使用第二个到第七个索引是有效的,但您通常希望避免这种情况。

第二,为什么要对照numbers[i + 1]检查numbers[i]?到那时,numbers[i + 1]还没有设置,因为它将在下一次迭代中设置。此外,即使这个问题不存在,您的代码也无法捕获以下序列:[ 5, 3, 5 ]

第三,我不太清楚为什么要使用两个不同的数组。虽然你肯定可以,但没有充分的理由这么做

我将建议另一种方法来解决您的问题,并在必要的步骤中添加注释。我希望这些能帮助你理解这个解决你问题的方法。

// Create an array for the chosen numbers
var numbers = [];
// Loop to generate 6 elements, zero-based
for(var i = 0; i < 6; i++) {
   // This variable will hold the number we choose
   var number;
   // This is a do-while loop which generates a random integer
   do {
      // Generate a random integer between 1 and 49 (incl.)
      number = Math.floor(Math.random() * 48) + 1;
   } while(numbers.indexOf(number) != -1); // Exit loop once the number is not contained in the array
   // Store the number in the array
   numbers[i] = number;
}

该算法时间短(8 SLOC),效率高。

这是一种方法:

var numbers = [];
for(i=0;i<6;i++){
 numbers[i] = Math.floor(Math.random()*48)+1;
//this loop will help us check all of the already assigned numbers.
  for(x=0;x<i;x++){
    if(numbers[x] == numbers[i]){
      i--;
    }
  }
}

这可能不是最有效和最佳的方法,但它确实有效,而且它不会让你重复数字,因为它会循环直到找到不同的数字。这是一个快速而短暂的解决方案,但不是最有效的。希望这能有所帮助。

for (var a=[],i=1;i<40;++i) a[i]=i;
     function shuffle(array) {
       var tmp, current, top = array.length;
       if(top) while(--top) {
       current = Math.floor(Math.random() * (top + 1));
       tmp = array[current];
       array[current] = array[top];
       array[top] = tmp;
      }
   return array;
  }
a = shuffle(a);

随机数,无重复

此语句永远不会为真:

if(numbers[i] == numbers[i+1]){

开始时,数字数组为空。然后为元素0随机指定一个。然后尝试将数字中的元素0与1进行比较,但数字[1]将是未定义的。

最好的方法是从一个空的arr数组开始,意思是长度为0。循环直到长度等于6。在循环中,生成一个随机数,只有在不存在该数的情况下,才将该值推入arr数组。

更新:

在看到一些答案后,我认为这可能是最简单的:

var arr = [],
    num;
while (arr.length < 6) {
    num = Math.floor(Math.random() * 48) + 1;
    if (arr.indexOf(num) === -1) {
        arr.push(num);
    }
}
console.log(arr);