在javascript中为元素分配随机数,但避免重复

在javascript中为元素分配随机数,但避免重复,javascript,jquery,Javascript,Jquery,如果您想直接进入问题,请向下滚动至粗体文本 我制作了一个由9个平铺(div)组成的网格的页面 其中1-9块可能有一个滑块 滑块都是通过jQuery设置的,每个函数 _gridSlider.each(function(){ // count slides, setup slider etc }); // end slider each function 一切正常,除了滑块都在同一时间改变,所以我想在开始时间中增加一些多样性 现在,我在每个函数内部为每个滑块创建一个介于1和X之间的随

如果您想直接进入问题,请向下滚动至粗体文本

我制作了一个由9个平铺(div)组成的网格的页面

其中1-9块可能有一个滑块

滑块都是通过jQuery设置的,每个函数

_gridSlider.each(function(){

     // count slides, setup slider etc

}); // end slider each function
一切正常,除了滑块都在同一时间改变,所以我想在开始时间中增加一些多样性

现在,我在每个函数内部为每个滑块创建一个介于1和X之间的随机ID(X是滑块的数量),如下所示

_gridSlider.each(function(){

     var _sliderID = Math.floor((Math.random() * _numSliders) + 1);

}); // end slider each function
然后,我在一个不同的时间启动滑块围绕这个ID像这样

    var _sliderStart = _sliderID + '000';

    setTimeout(function() {
        startTimer();
    }, _sliderStart);       
这很好。唯一的问题是两个或多个滑块可能具有相同的ID,我需要为每个滑块指定一个介于1和X之间的ID,但确保每个滑块具有不同的ID。
最终结果是1个计时器在1秒开始,另一个计时器在2秒开始,另一个计时器在3秒开始,等等。您可以使用此功能:

function generateId(numSliders) {
    var store = generateId._store;

    if (!store) {
        generateId._store = {};
    }

    do {
        var id = Math.floor(Math.random()*numSliders*1000+1);
    } while (store[id])

    store[id] = true;

    return id;
}
然后,您可以使用生成的id作为开始时间:

var sliderId = generateId(slidersNumber);
var sliderStart = sliderId; // without + '000'
UPD
generateId.\u存储将使用过的ID保存在自身内部。在该函数中,存储用作其函数的属性,以不向命名空间添加冗余变量。您可以将其置于
generateId
函数之外。例如:

var store = {};
function generateId(numSliders) {
    do {
        var id = Math.floor(Math.random()*numSliders*1000+1);
    } while (store[id])

    return id;
}
但在这种情况下,您会用冗余变量污染名称空间。
store
函数的内部用于稍微缩短代码。如果你愿意,你可以写:

function generateId(numSliders) {
    if (!generateId._store) {
        generateId._store = {};
    }

    do {
        var id = Math.floor(Math.random()*numSliders*1000+1);
    } while (generateId._store[id])

    generateId._store[id] = true;

    return id;
}

使用shuffle的示例

函数createNumberSeries(有多少个){
var结果=[];

对于(var count=1;count记录分配的数字,在选择新数字时,检查是否已分配,如果已分配,则生成另一个,直到唯一为止。
而在这种情况下,
是您的朋友。
是否新建日期().getTime()
帮助您?@localghost不是在一台可以在同一毫秒内执行多个操作的快速机器上。这一点很好。它返回毫秒。@Xotic750哦,是的,这很有意义!我将尝试一下!在Javascript中从未实际使用while循环,但会尝试一下!创建状态变量的有趣方法,但仍然不是po正在使用全局名称空间。这是某个地方的模式吗?@jasonscript实际上我不知道是否有这样的模式。我只是用了很长时间。您好,这个函数对我不起作用。我是否在每个函数中都使用它?我得到错误“存储未定义”。我不确定是什么,所以很难排除故障“store”是什么?store和“_store”之间的区别是什么?我想我需要在其他地方声明这些变量?@ChrisG Jones我更新了答案。也许现在更清楚了。我想你得到了“store”没有定义“错误,因为您没有执行`var store=generateId.\u store;`啊,谢谢您!是的,它工作得很好。我自己做了一点,但用您的替代了它,因为它工作得更好!”!