Javascript:从随机集合中排除元素-(好奇)

Javascript:从随机集合中排除元素-(好奇),javascript,random,Javascript,Random,我有一个关于javascriptMath.random()的问题: 我必须(对于我正在构建的游戏)随机生成给定集合中的每个数字(即从0到1000),每次我必须生成一个数字时,我必须检查该数字是否已经“生成” 考虑一个简单的算法来检查生成的集合中是否已经存在随机整数,这个解决方案非常简单。它循环生成数字,直到找不到为止。 下面是一个片段: /* ... */ for(var i = 0; i<upperBound; i++){ var randN = Math.floor(Math.

我有一个关于javascript
Math.random()
的问题:

我必须(对于我正在构建的游戏)随机生成给定集合中的每个数字(即从0到1000),每次我必须生成一个数字时,我必须检查该数字是否已经“生成”

考虑一个简单的算法来检查生成的集合中是否已经存在随机整数,这个解决方案非常简单。它循环生成数字,直到找不到为止。 下面是一个片段:

/* ... */
for(var i = 0; i<upperBound; i++){
    var randN = Math.floor(Math.random()*upperBound);
    while(myRandomNumbers.contains(randN)){
        loops++;
        randN = Math.floor(Math.random()*upperBound);
    }
    myRandomNumbers.push(randN);
}
/* ... */
/**/

对于(var i=0;i,如果您的数字范围不是太大,您可以简单地生成一个包含所有数字的列表,将其随机化,然后逐个选择


下面是对示例实现的一个快速修改,以显示此方法的实际效果:

如果您的数字范围不是太大,您可以简单地生成一个包含所有数字的列表,将其随机排列,然后逐个选择


下面是对示例实现的快速修改,以展示此方法的实际应用:

一个布尔1001大数组怎么样

如果要检查已生成的编号,只需检查数组中该位置的编号:

if (!arr[randomnumber]){
    arr[randomnumber] = true;
}
最后,您可以扫描阵列以找到所需的数字

这增加了对数字进行排序的副作用,因为扫描会按顺序将其挑选出来

我的一篇博文的主题与此类似:

一组1001大的布尔数怎么样

如果要检查已生成的编号,只需检查数组中该位置的编号:

if (!arr[randomnumber]){
    arr[randomnumber] = true;
}
最后,您可以扫描阵列以找到所需的数字

这增加了对数字进行排序的副作用,因为扫描会按顺序将其挑选出来

我的一篇博文的主题与此类似:

  • 按顺序生成一组数字
  • 对列表进行随机排序
  • 下面是一个使用的示例:

    for(var nums=[],i=0;i
    
  • 按顺序生成一组数字
  • 对列表进行随机排序
  • 下面是一个使用的示例:


    for(var nums=[],i=0;i我将创建一个数组并随机洗牌它:

    function shuffle(arr) {
        var shuffled = arr.slice(0), i = arr.length, temp, index;
        while (i--) {
            index = Math.floor(i * Math.random());
            temp = shuffled[index];
            shuffled[index] = shuffled[i];
            shuffled[i] = temp;
        }
        return shuffled;
    }
    
    // Create the array
    var i = 1000, arr = [];
    while (i--) arr[i] = i;
    
    // Shuffle it
    arr = shuffle(arr);
    

    我会创建一个数组并随机洗牌:

    function shuffle(arr) {
        var shuffled = arr.slice(0), i = arr.length, temp, index;
        while (i--) {
            index = Math.floor(i * Math.random());
            temp = shuffled[index];
            shuffled[index] = shuffled[i];
            shuffled[i] = temp;
        }
        return shuffled;
    }
    
    // Create the array
    var i = 1000, arr = [];
    while (i--) arr[i] = i;
    
    // Shuffle it
    arr = shuffle(arr);
    

    最好的方法可能是生成一个数字数组,然后使用

    以下是维基百科文章中给出的JavaScript示例:

    var n = a.length;
    for(var i = n - 1; i > 0; i--) {
        var j = Math.floor(Math.random() * (i + 1));
        var tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
    }
    

    (这假设您有一个数组“a”,其中包含要洗牌的项目。)

    最好的方法可能是生成一个数字数组,然后使用

    以下是维基百科文章中给出的JavaScript示例:

    var n = a.length;
    for(var i = n - 1; i > 0; i--) {
        var j = Math.floor(Math.random() * (i + 1));
        var tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
    }
    

    (假设您有一个数组“a”,其中包含要洗牌的项。)

    可能会有帮助。或者。@patrick dw:这是我的相同解决方案,递归;)是的,我读得太快了。可能会有帮助。或者。@patrick dw:这是我的相同解决方案,递归;)是的,我读得太快了。正如答案中所指出的,这不会给出一个非常随机的分布,并且在不同的浏览器中会有不同的偏差。Fisher-Yates shuffle没有那么多代码,而且会做得更好。请参阅
    shuffle()
    函数在我链接到的文件中,用于实现Fisher-Yates。如回答中所述,这不会给出非常随机的分布,并且在不同的浏览器中会有不同的偏差。Fisher-Yates shuffle没有那么多的代码,而且会做得更好。请参阅
    shuffle()
    我链接到的文件中的函数,用于实现Fisher-Yates。