Javascript 在x和y之间(而不是a和b之间)生成随机数的最佳方法

Javascript 在x和y之间(而不是a和b之间)生成随机数的最佳方法,javascript,random,range,Javascript,Random,Range,我有一张1000x600px的画布。我想在画布外生成精灵(但要均匀分布)。 检索(-500,-500)和(15001100)之间而不是(0,0)和(1000600)之间的随机值的最佳方法是什么?我知道可以使用while循环生成数字,直到它们在范围内,但这似乎是多余的。谢谢。只需生成介于(0,0)和(1,1)之间的数字,然后使用一些线性函数进行映射 否则,将希望随机坐标落下的区域划分为矩形。假设你得到了N个这样的矩形。可以通过将(0,0)和(1,1)之间的随机生成器的输出映射到该矩形(这是一个线性

我有一张1000x600px的画布。我想在画布外生成精灵(但要均匀分布)。
检索(-500,-500)和(15001100)之间而不是(0,0)和(1000600)之间的随机值的最佳方法是什么?我知道可以使用while循环生成数字,直到它们在范围内,但这似乎是多余的。谢谢。

只需生成介于(0,0)和(1,1)之间的数字,然后使用一些线性函数进行映射


否则,将希望随机坐标落下的区域划分为矩形。假设你得到了N个这样的矩形。可以通过将(0,0)和(1,1)之间的随机生成器的输出映射到该矩形(这是一个线性映射)来填充每个矩形。

如果要生成一个介于-500和1500之间的数字(不包括0到1000),只需生成一个介于0和1000(0--500+1500-1000)之间的数字即可

如果数字小于500,则减去500;如果数字大于或等于500,则添加500

或者,更一般地说:

function randomInt(outerMin, outerMax, innerMin, innerMax)
{
    var usableRange = innerMin - outerMin + outerMax - innerMax,
    threshold = innerMin - outerMin,
    num = Math.floor(Math.random() * (usableRange + 1));

    if (num < threshold) {
        return num - threshold;
    } else {
        return num - threshold + innerMax;
    }
}

randomInt(-500, 1500, 0, 1000);
函数randomInt(outerMin、outerMax、innerMin、innerMax)
{
var usableRange=innerMin-outerMin+outerMax-innerMax,
阈值=内部最小值-外部最小值,
num=Math.floor(Math.random()*(usableRange+1));
if(num<阈值){
返回num-阈值;
}否则{
returnnum-threshold+innerMax;
}
}
随机点(-5001500,01000);
对于二维点,你必须更具创造性。首先,生成两个位于禁止区域内的点,然后将这些值传播到良好区域:

function randomVector(outer, inner)
{
    var innerWidth = inner.right - inner.left,
    innerHeight = inner.bottom - inner.top,
    x = Math.floor(Math.random() * (innerWidth + 1)),
    y = Math.floor(Math.random() * (innerHeight + 1)),
    midx = Math.floor(innerWidth / 2),
    midy = Math.floor(innerHeight / 2);

    if (x < midx) { // left side of forbidden area, spread left
        x = x / midx * (inner.left - outer.left) - inner.left;
    } else { // right side of forbidden area, spread right
        x = (x - midx) / midx * (outer.right - inner.right) + inner.right;
    }

    if (y < midy) { // top side of forbidden area, spread top
        y = y / midy * (inner.top - outer.top) - inner.top;
    } else { // bottom side of forbidden area, spread bottom
        y = (y - midy) / midy * (outer.bottom - inner.bottom) + inner.bottom;
    }

    // at this point I'm not sure how to round them
    // but it probably should have happened one step above :)
    return {
        x: Math.floor(x),
        y: Math.floor(y)
    }
}

randomVector({
    left: -500,
    top: -500,
    right: 1500,
    bottom: 1100
 }, {
    left: 0,
    top: 0,
    right: 1000,
    bottom: 600
 });
函数随机向量(外部、内部)
{
var innerWidth=inner.right-inner.left,
innerHeight=inner.bottom-inner.top,
x=Math.floor(Math.random()*(innerWidth+1)),
y=Math.floor(Math.random()*(innerHeight+1)),
midx=数学地板(内宽/2),
midy=数学楼层(内部高度/2);
如果(x
重要

这是因为“禁止”区域之外的区域在各自的维度上是相等的,即
padding top==padding bottom&&padding left==padding right


如果这不同,则分布不再均匀。

生成一个介于0和1000之间的随机数,如果超过500,则加500(或分别加600),如果不求反。

可以计算一组允许的矩形,而不是一组禁止的矩形。要在任何允许的矩形内获得一个随机位置,首先选择一个随机矩形,然后在所选矩形内选择一个随机位置


当复角的大小不相等时,需要按面积对其进行加权,否则较小的矩形的密度将高于较大的矩形(200x100矩形的密度需要是10x20矩形的100倍)。

我认为这不能解决这种情况下的问题,因为禁区是二维的。不,这会起作用,我只需要为x做一次函数,为y做一次函数。(使用适当的值)@Philipp Sam是正确的,每个轴必须执行两次该功能:),但您只想排除x和y位于禁区内的位置。当其中只有一个在区域内时,就可以了(这将是区域正上方、下方或旁边的一个点)。@Sam好的,我想我们可以开始了:)我已经做了一些快速测试,但是如果有什么不正常,请告诉我。