1

这个问题已经被问过几次了,但从来没有确切地说我需要它。我正在尝试做这样的事情:我有一个固定数量的spans,我想给它们中的每一个一个 10px 到 46px 之间的字体大小。有些可以具有相同的值!允许使用小数(但我猜是没用的,因为浏览器处理“子像素”的方式不同(有人告诉我))。除此之外,我希望 left 和 top 属性的随机值介于 0 和 100 之间,但这些值永远不会相同

我走了这么远:(从这里借来的),但有时值重叠。

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

4 回答 4

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);
于 2013-09-14T18:28:08.667 回答
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 后,减去一个最大索引,你就达到了你想要的结果。

于 2013-09-14T18:31:22.617 回答
0

正如@BrokenGlass 所说,您需要一个随机排列的数组。所以首先,这是一个实现:

/**
 * 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
    });
});
于 2013-09-14T18:54:39.067 回答
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;

 }
于 2013-09-14T18:29:07.747 回答