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

Javascript 在JS中的循环内返回一个随机数,但绝不相同,javascript,jquery,random,Javascript,Jquery,Random,这个问题已经被问了好几次了,但从来没有问过我到底需要什么。我正在尝试这样做:我有一个固定数量的spans,我想给它们中的每一个设置一个介于10px和46px之间的字体大小有些可以具有相同的值小数是允许的(但我猜没用,因为浏览器处理“亚像素”的方式不同(我被告知))。除此之外,我希望左属性和顶部属性的随机值介于0和100之间,但这些值永远不能相同 我走了这么远:(从这里借来的),但有时价值重叠 function randomFromInterval(from,to) { return Ma

这个问题已经被问了好几次了,但从来没有问过我到底需要什么。我正在尝试这样做:我有一个固定数量的
span
s,我想给它们中的每一个设置一个介于10px和46px之间的字体大小有些可以具有相同的值小数是允许的(但我猜没用,因为浏览器处理“亚像素”的方式不同(我被告知))。除此之外,我希望左属性和顶部属性的随机值介于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
    });
});

您需要创建一个数组,其中包含已从该函数范围外的随机函数中使用的值。我会做下面这样的事情(未测试)。你会把你不想让随机数返回的变量传递给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);

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

    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;

 }
var Alredy_Used=[];
函数randomFromInterval(从,到){
var res=Math.floor(Math.random()*(to-from+1)+from);
如果(使用的总长度<(从+到))
{
if(Alredy_Used.indexOf(res)=-1)
{
Alredy_使用推送(res);
}
其他的
{
res=随机FromInterval(从,到);
}
}
其他的
{
Alredy_Used=[];
Alredy_使用推送(res);
}
返回res;
}

创建一个包含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;
}
var myArray=[];
对于(var指数=0;指数<101;指数++){
myArray[index]=索引;
}
//...
函数随机化(maxIndex){
var指数=随机数(maxIndex);
var returnValue=myArray[index];
myArray[index]=myArray[maxIndex];
返回值;
}

在每次调用randomize之后,减去一个最大索引,就得到了想要的结果。

正如@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
    });
});

只需获取一个值在0到100之间的数组,将数组洗牌,然后依次获取所需的第一个N。我得到以下错误:
uncaughttypeerror:无法调用undefined的方法'indexOf'。我不太明白您在何处以及如何定义
limitsArray
。它是函数中的一个参数,因此您可以在函数范围之外创建它来跟踪它。因此,在该函数外部创建一个数组,如var usedElements=new array();将其传递到函数中。然后,每次你得到一个随机变量,像usedElements.push()一样推进到那个usedElements数组中;你能在你的帖子中详细说明一下吗?我真的被卡住了,而且我对数组的使用经验不足,无法做到这一点。谢谢您的努力。对不起,我在试图使
createShuffleArray
更具可读性时把它弄糟了,使
j
不统一。现在应该纠正了。