1

给定一个从 100 到 400 的范围,我怎样才能在这个区间内生成数字,并且它们之间的差异不小于,比如说 20?

因此,这些数字的数组看起来像:[120, 155, 187, ...]

这是我从随机间隔生成数字的函数:

function randomFromInterval(from,to){
    return Math.floor(Math.random()*(to-from+1)+from);
}

有任何想法吗?

这是我尝试过的,但这很愚蠢:)

function generateNumbers(){

        var nr1 = randomFromInterval(100, xw-100);
        var nr1y = randomFromInterval(100, xw-100);

        var nr2 = randomFromInterval(100, xw-100);
        while (Math.abs(nr1 - nr2) < 20){
            nr2 = randomFromInterval(100, xw-100);
        }
        var nr2y = randomFromInterval(100, xw-100);

        var nr3 = randomFromInterval(100, xw-100);
        while (Math.abs(nr1 - nr3) < 20 && Math.abs(nr2 - nr3) < 20){
            nr3 = randomFromInterval(100, xw-100);
        }
        var nr3y = randomFromInterval(100, xw-100);

        var nr4 = randomFromInterval(100, xw-100);
        while (Math.abs(nr1 - nr4) < 20 && Math.abs(nr2 - nr4) < 20 && Math.abs(nr3 - nr4) < 20){
            nr4 = randomFromInterval(100, xw-100);
        }
        var nr4y = randomFromInterval(100, xw-100);

        var nr5 = randomFromInterval(100, xw-100);
        while (Math.abs(nr1 - nr5) < 20 && Math.abs(nr2 - nr5) < 20 && Math.abs(nr3 - nr5) < 20 && Math.abs(nr4 - nr5) < 20){
            nr5 = randomFromInterval(100, xw-100);
        }
        var nr5y = randomFromInterval(100, xw-100);

        var nrArray = [[nr1,nr1y],[nr2,nr2y],[nr3,nr3y],[nr4,nr4y],[nr5,nr5y]];
        console.log(nrArray);

        return nrArray;
    }
4

3 回答 3

2

因为我发现这是一个非常有趣的问题,并且我发现 3n1gm4 中的代码完全错误,所以我决定编写自己的脚本。

有很多方法可以做到这一点,我将向您展示其中的两种。第一个非常简单,但不是真正随机的。第二个有点复杂,但它会给你一个更好(更高程度的随机性)的结果。

您可以在http://jsfiddle.net/6nq9p/8/上看到这些方法的 SVG 可视化

第一种方法

function randomSpacedIntervalV1(min, max, count, spacing) {
    var available = max-min - spacing * (count-1);
    if (available<0) return false;
    // not able to fit the this amount of values in this range

    var arr = [];
    for (var i = 0; i<count; i++) {
        var temp     = Math.round( Math.random()*available );
        arr[i]       = ((i==0)? min+temp : arr[i-1] + temp + spacing);
        available   -= temp;
    }
    return arr;
}

第二种方法

这里唯一的区别是我们定义临时变量的部分。它从Math.round( Math.random()*available )变为Math.round( Math.random()*available / (count-1)*2 )

function randomSpacedIntervalV2(min, max, count, spacing) {
    var available = max-min - spacing * (count-1);
    console.log("available "+ available);
    if (available<0) return false;
    // not able to fit the this amount of values in this range

    var arr = [];
    for (var i = 0; i<count; i++) {
        var temp     = Math.round( Math.random()*available / (count-1)*2 );
        arr[i]       = (i==0)? min+temp : arr[i-1] + temp + spacing;
        available   -= temp;
    }
    return arr;
}

关于 3n1gm4 的回答

为了说明 3n1gm4 的代码是错误的,我在下面粘贴了他的 jsfiddle 的结果。

312 254 299 370 276 320 255 292 238 286

看看数字 254 和 255,它们是错误的,因为差值小于 10。

于 2013-08-13T20:36:46.907 回答
1

与其尝试生成完全独立的数字,不如在满足条件之前生成 n 个随机数?丢弃任何不符合您设置的标准的内容。您可以保留已生成的有效随机数的运行列表并对其进行检查。

查看https://stackoverflow.com/a/14568023/151234了解有关实施的想法。

于 2013-08-13T20:13:23.083 回答
0
function rand( from, to ) {
    return Math.floor(Math.random()*(to-from+1)+from);
}

// from:     starting number
// to:       ending number
// inc:      distance between each random number
// amount:   total number of random numbers
function spacedRandArray( from, to, inc, amount ) {
    var retArray = [rand(from,to)]; // sets the first element
    var temp = null;

    for ( var x = 0; x < amount-1; x++ ) {
        do {
            temp = rand( from, to );
        } while ( Math.abs( temp - retArray[x] ) <= inc );

        retArray.push( temp );
    }

    return retArray;
}

在行动:http: //jsfiddle.net/3n1gm4/qrWyR/

于 2013-08-13T20:20:28.963 回答