在我的Javascript程序中失去了逻辑
Losing the logic in my Javascript program
我对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);
- 为什么不't Javascript对我的输入值进行了一些重新检查
- 可以't让我的if语句处理js中的html表单输入
- 我的单元测试选项是什么
- 将输入字段中的文本提交到我的数据库,同时将其添加到我的列表中
- 我的职位回报太快了,如何做出承诺
- 我的jQuery插件参数没有正确启动,遇到了问题
- 如何识别我的网站中的慢速设备
- 如何将JSON数据导入我的ejs模板
- JQuery添加元素需要在我的js之前再次添加JQuery脚本
- 知道为什么我的旋转木马不会自动更改图片吗
- 我的模板未被解析
- 无法将数据从firebase获取到我的html页面
- 如果我滚动并刷新我的网页,我的导航标题会失去其属性.JQuery
- 在我的Javascript程序中失去了逻辑
- 为什么我的ajax元素立即失去了焦点
- 谁能告诉我如何禁用这段代码中的href链接,而不会失去我的网站上的嵌入能力
- 如何检查我的鼠标是什么元素,当我失去了输入元素的焦点
- 为什么“这个”失去了与我的对象的联系
- 我想添加一个facebook功能,当我的用户失去互联网连接时显示消息
- 我如何更新mysql字段时,我的用户失去连接到我的网站