基本上我正在创建一个网格并在其上绘制点,并且没有两个点可以在完全相同的位置[(3,4)与(4,3)不同]。 y坐标必须在2和7之间(所以2,3,4,5,6,7),x坐标必须在1和7之内。我有一个getRandom函数(可以在下面看到)生成一个最小和最大范围之间的随机数。这是我到目前为止所拥有的。
var xposition = [];
var yposition = [];
var yShouldBeDifferentThan = []
function placeRandom() {
for (s=0; s<xposition.length ; s++ ) {
if (xposition[s] == x) { // loops through all numbers in xposition and sees if the generated x is similar to an existing x
yShouldBeDifferentThan.push(yposition[s]); //puts the corresponding y coordinate into an array.
for (r=0; r<yShouldBeDifferentThan.length; r++) {
while (y == yShouldBeDifferentThan[r]) {
y = getRandom(2,7);
}
}
}
}
xposition.push(x);
yposition.push(y);
}
问题是,如果
xposition = [1, 5, 5, 7, 5, 5]
yposition = [1, 3, 7, 2, 3, 6]
yShouldBeDifferentThan = [3, 7, 3, 6]
首先,它会产生一个不同于3的随机数,比如说6.然后(我认为)会看到:6 == 7
?它没有。 6 == 3
?它没有。 6 == 6 ?它确实如此,因此生成一个不同于6的随机数。这就是问题出现的地方,它可能会生成数字3.我的getRandom
函数如下:
function getRandom(min, max) {
return min + Math.floor(Math.random() * (max - min + 1));
}
我在考虑制作getRandom
函数,以便我可以排除数字,但我不知道如何做到这一点。如果我可以让它排除数字,而不是placeRandom
函数的最后一个while循环,也许我可以做类似的事情:
y = getRandom(2,7) // excluding all numbers which already exist in the ShouldBeDifferentThan array
另请注意,由于我使用的是Internet Explorer 8,因此无法使用indexOf
方法。
答案 0 :(得分:2)
您的方法存在两个问题:
您可以为已经填满的行选择一个x坐标,这会将代码发送到永久循环中。
选择x坐标然后选择y坐标意味着根据之前在同一行中拾取的位置数来选择不同的位置。
而是选择一个x和y坐标,并检查之前是否选择了该特定坐标。如果是的话,重新开始。
function placeRandom() {
do {
var x = getRandom(2,7), y = getRandom(2,7), found = false;
for (s = 0; s<xposition.length; s++) {
if (xposition[s] == x && yposition[s] == y) {
found = true;
break;
}
}
} while(found);
xposition.push(x);
yposition.push(y);
}
另外,当网格开始变满(例如大约80%)时,你可以创建一个包含所有剩余位置的数组,并从中随机选择一个。
答案 1 :(得分:1)
var numbers = [ 1, 2, 3, 4, 5 ];
var exclude = [ 3, 4 ];
var filtered = [];
for (var i = 0; i < numbers.length; i += 1) {
if (exclude.indexOf(numbers[i]) === -1) {
filtered.push(numbers[i]);
}
}
var rand = Math.floor(Math.random() * filtered.length);
var num = filtered[rand]; // 1, 2 or 5
构建允许的数字列表,随机选择其中一个。 for循环只是数字和排除之间的差异,如:var filtered = numbers.diff(exclude);