JS:如何在使用Math.random()时排除一系列值?

时间:2016-04-23 11:50:17

标签: javascript

我正在为游戏中的玩家生成一些随机的x和y坐标:

var xcoordRed = Math.floor((Math.random() * 790) +1);
var ycoordRed = Math.floor((Math.random() * 400) +1);

但我需要从xcoordRed范围325 - 375ycoordRed 150 - 250中排除。

我如何有效地做到这一点?

2 个答案:

答案 0 :(得分:5)

简单的数学运算,通过排除范围的差异减小随机调用的范围,然后如果随机值大于下排除分隔符,则只需通过排除差异来增加它。含义:

var diff = 375 - 325; // add 1 if inclusive
var xcoordRed = Math.floor((Math.random() * (790 - diff)) +1);
if (xcoordRed >= 325)
    xcoordRed += diff;

// the same approach goes for Y

这意味着,如果随机值是324,它将保持为324.但是,如果它是330,它将变为380等。最高可能的随机数740将变为790当然。



var r = document.getElementById('r');
function gen() {
  var diffx = 375 - 325;
  var diffy = 250 - 150;
  var xcoordRed = Math.floor((Math.random() * (790 - diffx)) + 1);
  if (xcoordRed >= 325)
    xcoordRed += diffx;
  var ycoordRed = Math.floor((Math.random() * (400 - diffy)) + 1);
  if (ycoordRed >= 150)
    ycoordRed += diffy;
  
  r.textContent = 'X: ' + xcoordRed + ' Y: ' + ycoordRed;
}

<button onclick="gen()">Generate</button>
<div id="r"></div>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您可以创建一个允许列表数组,并从允许的范围中获取随机值。不确定这是否非常有效,但它可以使用多个块来排除。

&#13;
&#13;
function getArrayWithExcludes(min, max, exclude) {
  var _tmp = [];
  for (var i = min; i < max; i++) {
    if (!exclude.some(function(item) {
      return i > item.min && i < item.max
    }))
      _tmp.push(i);
  }
  return _tmp;
}

function getRandomValue(arr) {
  var len = arr.length;
  var random = Math.floor(Math.random() * len) % len;
  return arr[random];
}
var xExRange = [{
  min: 10,
  max: 50
}, {
  min: 325,
  max: 375
}];
var yExRange = [{
  min: 150,
  max: 250
}];
var xRange = getArrayWithExcludes(0, 790, xExRange);
var yRange = getArrayWithExcludes(0, 400, yExRange);

var xcoordRed = getRandomValue(xRange);
var ycoordRed = getRandomValue(yRange);

document.write("<pre>" + JSON.stringify({x:xcoordRed,y: ycoordRed},0,4) + "</pre>");
&#13;
&#13;
&#13;