在JS的循环中返回一个随机数,但从不相同

时间:2013-09-14 18:15:25

标签: javascript jquery random

这个问题已被问过几次,但从未确切地说我是如何需要它的。我正在尝试做类似这样的事情:我有一定数量的span s,我想给它们每个字体大小在10px到46px之间。 有些可以具有相同的值!允许小数(但我猜测无用,因为浏览器处理“子像素”的方式不同(我被告知))。除此之外,我想要左侧和顶部属性的0到100之间的随机值,但这些值永远不会相同

我做到了这一点:(从这里借来的SO),但有时价值重叠。

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

$("#question-mark-wrapper > span:not('.the-one')").each(function() {
    $(this).css({
        "font-size": randomFromInterval(10,36) + "px", // Can be the same value twice
        "left": randomFromInterval(0,100) + "%", // Cannot be the same value twice
        "top": randomFromInterval(0,100) + "%", // Cannot be the same value twice
    });
});

4 个答案:

答案 0 :(得分:2)

您需要创建一个数组,其中包含您在该函数范围之外的随机函数中已使用的值。我会在下面做这样的事情(未经测试)。并且您将传递给limitsArray您不希望随机返回的变量。因此,您需要在再次调用之前将任何返回的随机变量推送到limitsArray。

var usedNumbers = new Array();

function randomFromInterval(from, to, limitsArray) {

    var randomNumber = Math.floor(Math.random()*(to-from+1)+from);
    if ( limitsArray.indexOf(randomNumber) != -1 )
        return randomNumber;
    else
        randomFromInterval(from,to,limitsArray);
}

var randomNumber = randomFromInterval(0,100,usedNumbers);
usedNumbers.push(randomNumber);

答案 1 :(得分:1)

创建一个包含100个元素的数组,如下所示:

var myArray = [];
for (var index = 0; index < 101; index++) {
    myArray[index] = index;
}

//...

function randomize(maxIndex) {
    var index = randomizeMyNumber(maxIndex);
    var returnValue = myArray[index];
    myArray[index] = myArray[maxIndex];
    return returnValue;
}

每次调用randomize后,减去一个最大指数,即可获得所需的结果。

答案 2 :(得分:0)

保留一个全局变量数组以跟踪使用的数字。

    var Alredy_Used = [];
    function randomFromInterval(from,to) {
    var res= Math.floor(Math.random()*(to-from+1)+from);

     if(Alredy_Used.length < (from + to))
     {
       if(Alredy_Used.indexOf(res) == -1 )
       {
        Alredy_Used.push(res);
       }
       else
       {
        res = randomFromInterval(from, to) ;  
       }

    }
    else
    {
      Alredy_Used = [];
      Alredy_Used.push(res);
    }
    return res;

 }

答案 3 :(得分:0)

正如@BrokenGlass所说,你需要一个shuffled数组。首先,这是一个实现:

/**
 * Create a shuffled array containing all values of [from, to]
 */
function createShuffledArray(from, to) {
    var i = to - from + 1;
    var a = Array(i);
    while (i) {
        var j = Math.floor(Math.random() * i--);
        var temp = isNaN(a[i]) ? (i + from) : a[i];
        a[i] = isNaN(a[j]) ? (j + from) : a[j];
        a[j] = temp;
    }
    return a;
}

现在你想要创建这样的混洗数组并从那里弹出:

var lefts = createShuffledArray(0, 100);
var tops = createShuffledArray(0, 100);
$("#question-mark-wrapper > span:not('.the-one')").each(function() {
    $(this).css({
        "font-size": randomFromInterval(10,36) + "px", // Can be the same value twice
        "left": lefts.pop() + "%", // Cannot be the same value twice
        "top": tops.pop() + "%", // Cannot be the same value twice
    });
});