Javascript – 生成范围中的随机数,不包括某些数字

基本上我正在创建一个网格并在其上绘制点,并且没有两个点可以在完全相同的位置[(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方法。

您的方法存在两个问题:

  • 您可以为已经满的行选择x坐标,这会将代码发送到永久循环中。

  • 选取x坐标然后选择y坐标意味着根据之前在同一行中拾取的位置数量,位置将有不同的选择机会。

而是只选择一个x和y坐标,并检查之前是否选择了该特定坐标。 如果是的话,重新开始吧。

 function placeRandom() { do { var x = getRandom(2,7), y = getRandom(2,7), found = false; for (s = 0; s 

另外,当网格开始变满(例如大约80%)时,您可以创建一个包含所有剩余位置的数组,并从中随机选择一个。

 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);