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

S C*_*aig 2 javascript

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

var xcoordRed = Math.floor((Math.random() * 790) +1);
var ycoordRed = Math.floor((Math.random() * 400) +1);
Run Code Online (Sandbox Code Playgroud)

但我需要排除xcoordRed范围325 - 375ycoordRed 150 - 250.

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

Sho*_*omz 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
Run Code Online (Sandbox Code Playgroud)

这意味着,如果随机值是,例如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;
}
Run Code Online (Sandbox Code Playgroud)
<button onclick="gen()">Generate</button>
<div id="r"></div>
Run Code Online (Sandbox Code Playgroud)