我正在尝试构建一个包含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>
答案 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);
}
答案 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
。
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;
答案 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)
您正在获取重复项,因为您没有再次检查所有现有号码的新号码。希望这会有所帮助:
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;
答案 7 :(得分:0)
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(...)
,因为两者都相同。